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

时间:2014-03-10 17:10:35

标签: 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会死掉)。

现在我们需要:

  1. 将这个树存档到一个大文件中(它必须相对较快,但也具有良好的压缩率 - 因此,7z太慢了)

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

  3. 我不会使用Redis,因为将来文件的数量可能会增加,并且RAM中没有空间。但另一方面,我可以使用基于SSD的服务器来进行数据访问,速度相对较快(与硬盘相比)。

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

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

1 个答案:

答案 0 :(得分:0)

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

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