【发布时间】:2014-07-18 07:48:18
【问题描述】:
我有一个大约 200 万行的文件,如下所示:
2s,3s,4s,5s,6s 100000
2s,3s,4s,5s,8s 101
2s,3s,4s,5s,9s 102
第一个逗号分隔部分表示奥马哈扑克结果,而后一个分数是牌的示例“值”。在 C++ 中尽可能快地读取此文件对我来说非常重要,但我似乎无法让它比使用基本库的 Python 中的简单方法(4.5 秒)更快。
使用 Qt 框架(QHash 和 QString),我能够在发布模式下在 2.5 秒内读取文件。但是,我不想拥有 Qt 依赖项。目标是允许使用这 200 万行进行快速模拟,即 some_container["2s,3s,4s,5s,6s"] 以产生 100(尽管如果应用翻译功能或任何不可读的格式也可以加快阅读速度,也可以)。
我当前的实现非常慢(8 秒!):
std::map<std::string, int> get_file_contents(const char *filename)
{
std::map<std::string, int> outcomes;
std::ifstream infile(filename);
std::string c;
int d;
while (infile.good())
{
infile >> c;
infile >> d;
//std::cout << c << d << std::endl;
outcomes[c] = d;
}
return outcomes;
}
如何尽快将这些数据读入某种键/值散列?
注意:前 16 个字符始终存在(卡片),而分数可以达到 100 万左右。
从各种 cmet 收集的一些进一步信息:
- 样本文件:http://pastebin.com/rB1hFViM
- 内存限制:750MB
- 初始化时间限制:5s
- 单手计算时间限制:0.5s
【问题讨论】:
-
如果快速访问如此重要,为什么要将这些数据存储为文本?
-
@KerrekSB 不幸的是,我不知道替代方案。请注意,这是一场友谊赛;该解决方案必须是独立的,并且不能连接到数据库。
-
那么,文件生成超出了您的控制范围?在这种情况下,您可以使用的最快数据结构是带有预分配块的 unordered_map。
-
如果可以,以固定宽度的二进制表示形式存储数据。
-
@PascalvKooten:无需学习 CS 即可成为一名程序员。我推荐看this video series。
标签: c++ hashmap containers