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


0

rI接管了一个软件的责任,该软件将数据预处理成数百万个具有类似geohash结构的小(48k)文件的深层目录结构。
移动和复制这些文件真的很痛苦。

首先,我想将数据备份到一些存档中,以减少文件系统的负载。作为下一步,我想增强工具来处理档案而不是文件。

出现第一个问题然后将这些文件打包到存档中。

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。


在7zip和Windows的归档过程中会出现什么样的错误?在命令行上执行该过程是一个选项吗?
daniel.neumann

我试过了两个。 7zip的gui和命令行版本。我不记得GUI错误(我认为它未指定),CLI说明: ERROR: Can't allocate required memory!。但我只是认识到使用的版本真的很旧。检查一个新的
vlad_tepesch

你试图查找那个错误吗?它可能与命令行会话可用的内存量有关。为了减少压缩过程本身所需的内存量,您可以在不打包的情况下归档数据。
daniel.neumann

@ daniel.neumann我拥有16G内存的计算机的所有权限。我还测试了该工具的最新版本。它开始压缩并在一夜之间它也会因一个奇怪的错误而中止:“Das System kanndiebenötigteSpeichermengenicht bereitstellen”翻译:系统无法提供所需的内存量超出内存错误。与扫描文件后直接带来错误的旧版本不同,新版本在处理数小时后退出:-(
vlad_tepesch

Answers:


0

关于适当的存档文件格式,您可能根本不需要存档吗?尝试使用 tar 代替 zip。如果这无济于事,请尝试将它们组织成层次结构,类似的方式 git 要么 squid 通过分隔顶级和第二级子目录将大量文件存储在其缓存目录中,例如: 16/256/64,因此当您尝试打开这些文件时,您将获得较少数量的未确认I / O请求。

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

  • 使用 Redis的 或Memcached缓存已读取的内存中的数据,
  • 尝试将它们放入某些文件系统,例如 RAMFS 要么 TMPFS ,所以它存在于记忆中,
  • 使用虚拟内存触摸器等 vmtouch 它可以将文件映射到虚拟存储器,例如将文件放在内存中: vmtouch -vt file123.geo,或监视整个文件夹,尝试: vmtouch -dl /path/dir

但是,如果文件很小并且它们包含一些特定数据(如geohashes),那么是否可以考虑将它们导入数据库?如 MariaDB的 要么 MongoDB的 ?或者也许可以使用索引 Solr搜索 要么 弹性搜索 ?但最后,这一切都取决于您的具体技术要求。


据我所知,tar不符合“随机文件访问”标准。此外,我已经有一个嵌套的目录结构。从第一个开始就放置在内存中没有选项:数据太大2:预处理只进行一次并且确实需要很长时间。之后,预处理数据用于后续程序运行。以编程方式使用该文件不是问题。但处理/部署它们是。
vlad_tepesch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.