从C ++将大型txt文件加载到数据结构中

时间:2016-02-26 21:02:43

标签: c++ windows-7 fgets

我想在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分钟!

1 个答案:

答案 0 :(得分:1)

某些操作系统提供称为内存映射的功能,其中操作系统将文件视为内存。操作系统处理将数据读入内存。

您可能需要考虑使用块读取。将数据块读入内存和搜索内存。

这里的想法是优化文件和内存之间的数据传输。一次读一行不如读取10k或更多的块有效。

另一种技术是使用多个线程。让一个线程将文件中的数据读入缓冲区。另一个线程处理数据。可能的第三个线程输出结果。

一个简单的技巧是将字符串的长度预分配到最长行的某个百分比。不要继续重新分配或声明新字符串,而是重用这个大字符串。字符串大小调整会有一些执行惩罚。