Python中是否有允许在单个文件中管理虚拟文件系统的库



我正在编写一个程序。我想我不需要在这里展示它,但我想知道是否可以创建存储在单个文件上的虚拟文件系统。例如,我有一个名为my_file_system.fs的文件,是否有一种方法可以仅在该文件中创建虚拟文件系统。基本上:

/home/xcodz/
|
+--myfilesystem.fs
|
+--testdir
+--test.txt
+--downloads
|
+--example1.txt

我基本上想要基本的文件系统接口。没有所有者、日期或其他元数据。Zip是一个好主意,但它只是一次读取系统中的整个文件,而不提供类似文件的接口。所以我需要一个非常基本的文件系统,在单个文件中,我可以像使用普通IO对象一样使用文件。

EDIT存储在文件系统中的文件对于一个文件来说将有3 GB那么大,而我没有那么多ram。TarFiles似乎并没有让我的工作变得更好

EDIT我的意思是说一些文件系统,就像带有虚拟箱的文件系统一样。

解决方案#1-TAR文件

TAR文件基本上是单个文件中的unix文件系统。您可以使用tarfile在python中使用它们。

优点:

  • 开箱即用
  • 具有POSIX文件系统的所有功能
  • tarfile提供流读取器&用于文件的编写器API

缺点:

  • 没有非POSIX功能,如加密或内存映射文件
  • 文件无法就地编辑,您必须提取它们,然后重新添加

解决方案#2-环回文件系统

如果您可以要求完成装载以运行程序,那么您只需使用环回文件系统:

$ truncate -s 100M /tmp/loopback.ext4
$ mkfs -t ext4 /tmp/loopback.ext4
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done                            
Creating filesystem with 25600 4k blocks and 25600 inodes
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo mkdir /mnt/loop
$ sudo mount -o loop /tmp/loopback.ext4 /mnt/loop/
$ df -T /mnt/loop
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/loop11    ext4   93M   72K   86M   1% /mnt/loop
$ sudo tree /mnt/loop/
/mnt/loop/
└── lost+found
1 directory, 0 files

优点:

  • 像常规文件系统一样使用
  • 可从python进程外部访问,离线和在线均可
  • 非常容易调试
  • 您可以添加加密、使用内存映射文件以及真实文件系统的任何其他功能

缺点:

  • 需要root用户
  • 需要在运行进程之前进行装载
  • 需要卸载(至少在发生崩溃时(
  • 必须预先设置大小,调整大小是可能的,但不是微不足道的
  • 很难支持跨平台

解决方案#3-DYI文件系统

由于您最关心文件I/O,因此可以使用BytesIO来实现。要支持文件系统层次结构中的多个文件,可以将这些文件放在trie中。您需要序列化和反序列化所有这些,为此您可以使用pickle。

优点:

  • 比基于TAR的解决方案更易于定制
  • 可以制作成一个图书馆,美观且可重复使用

缺点:

  • 需要更多的代码
  • 每次对整个数据结构进行pickle是不可扩展的
  • 如果您需要碰撞安全,则需要在对trie或任何文件进行每次(相关(修改后进行pickle

选择什么

由于您的需求是非常基本的,请选择#1-TAR文件。

您可以使用SVFS包。

SVFS允许在真实文件系统上的文件内部创建虚拟文件系统。它可以用于在单个文件中存储多个文件(具有目录结构(。与归档不同,SVFS允许就地修改文件。SVFS文件使用类似文件的接口,因此它们可以像常规Python文件对象一样使用。最后,它是用纯python实现的,不使用任何第三方模块,所以它应该是非常可移植的。测试显示写入速度约为10-12MB/s,读取速度约为26-28MB/s。

相关内容

  • 没有找到相关文章

最新更新