【问题标题】:Recommendation for how to best handle information for random access?关于如何最好地处理随机访问信息的建议?
【发布时间】: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 会死)。

现在我们需要:

  1. 将此树归档到一个大文件中(它必须相对较快,但压缩比也不错,因此 7z 太慢了)

  2. 快速查找结果大文件——所以,当我需要获取“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。这主要是文本数据,而不是二进制数据。

标签: python gzip archive zlib


【解决方案1】:

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

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

【讨论】:

  • 好吧,你所描述的并不是很简单,它看起来更像是一个小型数据库引擎,而不是一个简单的解决方案......是的,你的想法很好,我可能会同意你的观点,但我希望这里有另一种解决方案,使用起来既方便又简单。
猜你喜欢
  • 2011-06-26
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多