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)
因此,我正在寻找两个问题的建议:
什么是合适的存档文件格式(以及可以处理此用例的工具)允许随机访问文件。文件中的数据不需要随机访问。因为文件足够小,可以加载到内存中。
是否有一个 C/C++ 库可以实现尽可能接近正常文件处理的存档访问,以便尽可能减少源代码的更改?该软件本身使用 Qt/Boost。
答案1
关于适当的存档文件格式,也许您根本不需要存档它?尝试使用tar
而不是zip
。如果这没有帮助,请尝试将它们组织成层次结构,类似于git
或squid
通过分离顶级与第二级子目录在其缓存目录中存储大量文件的方式,例如:16/256/64
,这样当您尝试打开这些文件时,未确认的 I/O 请求数量就会减少。
其次您应该考虑缓存,这里有一些建议:
- 使用Redis或者使用 Memcached 将已经读取的数据缓存在内存中,
- 尝试将它们放入某个文件系统,例如内存文件系统或者临时文件,这样就驻留在内存中,
- 使用虚拟内存触摸器,例如
vmtouch
可以将文件映射到虚拟内存中,例如将文件放在内存中:vmtouch -vt file123.geo
,或监视整个文件夹,请尝试:vmtouch -dl /path/dir
但是如果文件很小,并且包含一些特定数据(如地理哈希),也许可以考虑将它们导入数据库?例如玛拉雅数据库或者MongoDB? 或者使用以下方法对它们进行索引Solr 搜索或者弹性搜索? 但最终这一切都取决于您的具体技术要求。