Python 关于如何最好地处理随机访问信息的建议?

Python 关于如何最好地处理随机访问信息的建议?,python,gzip,archive,zlib,Python,Gzip,Archive,Zlib,假设您有一个文件系统树: root/AA/aadata root/AA/aafile root/AA/aatext root/AB/abinput root/AB/aboutput root/AC/acinput ... 总共有大约1000万个文件。每个文件的大小约为10kb。它们大多类似于一个键值存储,由文件夹分隔,只是为了提高速度(如果我将500万个文件放在一个文件夹中,FS将死亡) 现在我们需要: 将此树归档到单个大文件中(它必须相对较快,但也具有良好的压缩比-因此,7z太慢) 快速查找

假设您有一个文件系统树:

root/AA/aadata
root/AA/aafile
root/AA/aatext
root/AB/abinput
root/AB/aboutput
root/AC/acinput
...
总共有大约1000万个文件。每个文件的大小约为10kb。它们大多类似于一个键值存储,由文件夹分隔,只是为了提高速度(如果我将500万个文件放在一个文件夹中,FS将死亡)

现在我们需要:

  • 将此树归档到单个大文件中(它必须相对较快,但也具有良好的压缩比-因此,7z太慢)

  • 快速查找结果大文件-因此,当我需要获取“root/AB/aboutput”的内容时,我应该能够非常快速地读取它

  • 我不会使用Redis,因为将来文件的数量可能会增加,并且RAM中没有空间容纳它们。但另一方面,我可以使用SSD供电的服务器来访问数据,速度会相对较快(与HDD相比)

    此外,它不应该是任何外来的文件系统,例如
    squashfs
    或类似的文件系统。它应该在普通的EXT3、EXT4或NTFS中工作

    我还考虑将文件存储为一个简单的zlib压缩字符串,记住每个字符串的文件偏移量,然后在RAM中创建类似于映射的内容。每次我需要一个文件时,我都会从地图上读取内容偏移量,然后使用偏移量从实际文件读取内容偏移量。但也许有更简单的或已经做过的事情?

    假设(根据内容中的信息)。您可以使用以下策略:使用两个文件(一个用于“索引”,第二个用于实际内容。为简单起见,将第二个文件设置为一组“块”(例如8196个)。要处理您的文件,请将它们读入文件名(键)的编程结构中以及内容开始的第二个文件的块号。将文件内容写入第二个文件(如果存储空间不足,则压缩)。保存索引信息


    若要检索,请将索引文件读入programmattic存储器,并以二叉树的形式存储。如果搜索时间有问题,您可以将键散列并将值存储到表中,并通过简单的“添加到下一个可用插槽”来处理冲突。若要检索内容,请获取块号(和长度)从索引中查找;从第二个文件中读取内容(如果压缩,请展开)。

    这与编程有什么关系?@RobertHarvey我正在寻找1)Python的最佳解决方案,2)高效存储这些文件的算法\解决方案。换句话说,我并不需要一种文件格式来存储所有内容——我还需要一种读取它们的解决方案。文件多久会被更改一次?文件是否都具有不同的文件长度?文件大小的完整范围是多少?您能提出哪些其他特征来帮助我们了解如何帮助您?使用Winzip或7z的文件的平均压缩率是多少?@RobertHarvey:这个问题至少涉及“软件算法”和“程序员常用的软件工具”,但涉及到中列出的其他字段。@erstwileii这是只读的“文件”。。。它不应该被改变,只有在需要时(可能一个月两次)才从头开始重建。文件大小从几个字节到100kb不等,但平均约为10kb。这主要是一个文本数据,而不是二进制数据。好吧,你所描述的不是很简单,它看起来更像一个小型数据库引擎,而不是一个简单的解决方案。。。是的,你的想法很好,我可能会同意你,但我希望这里有另一个解决方案,它将是方便和简单的工作。