【发布时间】:2014-04-13 22:37:50
【问题描述】:
假设你有一个文件系统树:
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 中。每次我需要一个文件时,我都会从地图中读取内容偏移量,然后 - 使用偏移量 - 从实际文件中读取。但也许有一些更容易或已经完成的事情?
【问题讨论】:
-
这个编程有什么关系?
-
@RobertHarvey 我正在寻找 1) Python 的最佳解决方案,2) 有效存储这些文件的算法\解决方案。换句话说,我并不完全需要一种文件格式来存储所有内容——我还需要一个解决方案来读取它们。
-
文件多久更改一次?文件是否都有不同的文件长度——文件大小的全部范围是多少?您还可以提出哪些其他特征来帮助我们弄清楚如何为您提供帮助?使用 Winzip 或 7z 的文件的平均压缩率是多少?
-
@RobertHarvey:这个问题至少是关于“一种软件算法”和“程序员常用的软件工具”,但涉及到stackoverflow.com/help/on-topic中列出的其他领域。
-
@ErstwhileIII 这是只读的“文件”...它不应该被更改,只能在需要时从头开始重建(可能每月 2 次)。文件大小从几个字节变化到 - 比如说 - 100kb,但平均值约为 10kb。这主要是文本数据,而不是二进制数据。