我想在win7上的visual studio 2013上将C ++ seperaetd txt文件加载到C ++的地图数据结构中。
目前,txt文件有5000行和300 KB 每一行都由一个新行分隔。 我使用getline(),花了90秒才完成加载整个文件。
该文件如下:
id , value1, value2, value3 , … // about 50+ columns
abc,36.1,69.15,96.358 , ….
pwr, ….
我需要地图中的最终格式>数据结构如:(id是地图中的索引,列名是另一个索引。)
abc value1 36.1
value2 69.15
value3 96.358
…
pwr …
我的C ++代码:
while (getline(file, aLine))
{
**UPDATE**
// split the line by comma
stringstream ssa(aLine);
vector<string> line;
while (ssa.good())
{
string asubStr;
getline(ssa, asubStr, ',');
line.push_back(asubStr);
}
// cast each string to double if needed.
myMap[id][valueX] = y ; // X can be 1, 2, 3, … 50,
// y is the number of a value column in
// the file,
//myMap is map <string, map<string, double >>
}
我的最终文件大小可以是60MB和100万行。
是否可以在C ++中保存地图中的所有数据? 以及如何将文件快速加载到C ++中? 5000线的90秒太慢了。
在C ++中,fgets()对我不起作用,因为我不知道文件中的元素数量。
我想尽快加载文件,然后处理数据结构中的每一行。
由于
更多更新 我进行了更改,以便只将每行加载为字符串而不进行任何拆分。
set<string> mySet;
while (getline(file, aLine))
{
mySet.insert(aLine); // this is all what I do in the loop.
}
但是,5000线仍需要12秒。因此,对于1百万行,需要40分钟!
答案 0 :(得分:1)
某些操作系统提供称为内存映射的功能,其中操作系统将文件视为内存。操作系统处理将数据读入内存。
您可能需要考虑使用块读取。将数据块读入内存和搜索内存。
这里的想法是优化文件和内存之间的数据传输。一次读一行不如读取10k或更多的块有效。
另一种技术是使用多个线程。让一个线程将文件中的数据读入缓冲区。另一个线程处理数据。可能的第三个线程输出结果。
一个简单的技巧是将字符串的长度预分配到最长行的某个百分比。不要继续重新分配或声明新字符串,而是重用这个大字符串。字符串大小调整会有一些执行惩罚。