微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

编辑 我真的想说一些文件系统,就像带有虚拟盒的文件系统一样。

解决方法

解决方案 #1 - TAR 文件

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

优点:

  • 开箱即用。
  • 具有 POSIX 文件系统的所有功能。
  • tarfile 为文件提供流 readerwriter API。

缺点:

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

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

如果您可以要求完成挂载以运行您的程序,您只需use a loopback filesystem

$ 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。
  • 在运行您的进程之前需要安装。
  • 需要卸载(至少,在崩溃的情况下)。
  • 必须预先设置大小,可以调整大小但并非微不足道。
  • Very difficult to support cross-platform

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

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

优点:

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

缺点:

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

选择什么

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

,

您可以使用 SVFS 包。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。