【发布时间】:2017-05-07 11:35:07
【问题描述】:
我有大文件,包含少量大数据集。每个数据集都包含一个名称和数据集大小(以字节为单位),允许跳过它并转到下一个数据集。
我想快速建立数据集名称的索引。一个文件示例大约 21MB 大,包含 88 个数据集。通过使用std::ifstream 和seekg() 在数据集之间跳过来快速读取 88 个名称大约需要 1300 毫秒,我想减少。
所以事实上,我正在读取 88 个大约 30 字节的块,位于 21MB 文件中的给定位置,并且需要 1300 毫秒。
有没有办法改善这一点,还是操作系统和文件系统的限制?我在 Windows 7 64bit 下运行测试。
我知道在文件的开头有一个完整的索引会更好,但是文件格式没有这个,我们不能改变它。
【问题讨论】:
-
这些是文本文件吗? Windows 是否仍然在行尾存储回车和换行符?如果是这样,是否使用 ifstream 搜索逻辑文本文件,过滤掉回车字符?如果是这样,也许您可以以原始二进制模式打开文件,从而防止查找功能必须读取所有字符以避免在查找偏移中包含 CR?但是当然,您的代码可能不得不忽略未过滤的回车。
-
您可以选择分割成 88 个小文件且数据格式不变吗?
-
是否有可能将索引信息完全写入一个单独的文件,或者(如果您不能这样做)将其全部写入文件末尾的一个位置?如果你能做到这一点,你就可以避免(几乎)所有的寻求;您只需从一个地方读取少量信息。
标签: c++ file random-access