如何处理/存档/访问大量小文件

如何处理/存档/访问大量小文件

r我接手了一个软件的开发工作,该软件将数据预处理成一个深层目录结构,该目录结构包含数百万个小文件(48k),具有类似 geohash 的结构。
移动和复制这些文件真的很麻烦。

首先,我想将数据备份到某个档案中,以减少文件系统的负载。下一步,我想增强该工具,使其能够处理档案而不是文件。

将这些文件打包到档案中时,第一个问题就已经出现了。

Windows zip 工具和 7zip 会中止该过程。此外,gnuWin32 附带的 zip 工具也会Zip 3.0 (July 5th 2008), by Info-Zip使用以下命令取消操作:zip error: Out of memory (local_to_display_string)

因此,我正在寻找两个问题的建议:

  1. 什么是合适的存档文件格式(以及可以处理此用例的工具)允许随机访问文件。文件中的数据不需要随机访问。因为文件足够小,可以加载到内存中。

  2. 是否有一个 C/C++ 库可以实现尽可能接近正常文件处理的存档访问,以便尽可能减少源代码的更改?该软件本身使用 Qt/Boost。

答案1

关于适当的存档文件格式,也许您根本不需要存档它?尝试使用tar而不是zip。如果这没有帮助,请尝试将它们组织成层次结构,类似于gitsquid通过分离顶级与第二级子目录在其缓存目录中存储大量文件的方式,例如:16/256/64,这样当您尝试打开这些文件时,未确认的 I/O 请求数量就会减少。

其次您应该考虑缓存,这里有一些建议:

  • 使用Redis或者使用 Memcached 将已经读取的数据缓存在内存中,
  • 尝试将它们放入某个文件系统,例如内存文件系统或者临时文件,这样就驻留在内存中,
  • 使用虚拟内存触摸器,例如vmtouch可以将文件映射到虚拟内存中,例如将文件放在内存中:vmtouch -vt file123.geo,或监视整个文件夹,请尝试:vmtouch -dl /path/dir

但是如果文件很小,并且包含一些特定数据(如地理哈希),也许可以考虑将它们导入数据库?例如玛拉雅数据库或者MongoDB? 或者使用以下方法对它们进行索引Solr 搜索或者弹性搜索? 但最终这一切都取决于您的具体技术要求。

相关内容