解决方案 #1 - TAR 文件
TAR 文件基本上是单个文件中的 unix 文件系统。您可以使用tarfile在 python 中使用它们。
优点:
缺点:
- 没有非 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 进程之外,离线和在线访问。
- 非常容易调试。
- 您可以添加加密、使用内存映射文件以及真实文件系统的任何其他功能。
缺点:
- 需要根。
- 在运行您的进程之前需要安装。
- 需要卸载(至少,在崩溃的情况下)。
- 必须预先设置大小,可以调整大小但并非微不足道。
- 很难支持跨平台。
解决方案 #3 - DYI 文件系统
由于您最关心文件 I/O,因此您可以使用BytesIO来实现它。要支持文件系统层次结构中的多个文件,您可以将这些文件放在trie中。您需要序列化和反序列化所有这些,您可以使用pickle。
优点:
- 比基于 TAR 的解决方案更容易定制。
- 可以做成一个库,美观且可重复使用。
缺点:
- 需要更多的编码。
- 每次都酸洗整个数据结构是不可扩展的。
- 如果您需要碰撞安全,则需要在对 trie 或任何文件进行每次(相关)修改后进行 pickle。
选择什么
由于您的需求非常基本,请选择 #1 - TAR 文件。