我正在编写一个程序。我想我不需要在这里展示它,但我想知道是否可以创建存储在单个文件上的虚拟文件系统。例如,我有一个名为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。