在C++中从CSV中逐行使用数据的有效方法 如果在C++中逐行处理文件中存在的数据,那么最有效的方法是什么?也就是说,在移动到下一行之前,一次只使用文件中的一行来执行一些冗长的计算。我考虑过以下几种选择,但无法决定哪一种更合适

在C++中从CSV中逐行使用数据的有效方法 如果在C++中逐行处理文件中存在的数据,那么最有效的方法是什么?也就是说,在移动到下一行之前,一次只使用文件中的一行来执行一些冗长的计算。我考虑过以下几种选择,但无法决定哪一种更合适,c++,C++,现在我正在做一些事情,比如打开,做所有的事情,最后关闭: string line; fstream myfile; int numlines = 1000; myfile.open("myfile.csv"); for(int i = 0; i < numlines; i++){ getline(myfile, line); // do something using read data }; myfile.close(); 这里有什么陷阱吗?或者上述任何一种解决方案

现在我正在做一些事情,比如打开,做所有的事情,最后关闭:

string line; 
fstream myfile;
int numlines = 1000;
myfile.open("myfile.csv");
for(int i = 0; i < numlines; i++){
    getline(myfile, line); 
    // do something using read data
};
myfile.close();

这里有什么陷阱吗?或者上述任何一种解决方案如果有效的话都一样好吗?我在想,也许让文件保持打开状态几个小时不是个好主意,但在内存中保留一个大的双2D数组听起来也不太合适…

如果可以,请使用1。如果必须,请使用3。永远不要使用2

为什么??选项1仅将存储器用于单行缓冲区。它只遍历文件一次。由于打开的文件通常不是昂贵的资源,因此它可能是最便宜、最简单的资源

然而,选项1并不总是足够的。有时您需要以随机顺序处理行。这里是选项3最好的地方。在这种情况下,如果有足够的内存,读取整个文件并将内容提取到内存中是最简单的方法。在许多情况下,字符串数组就足够了。在您的中,行似乎包含双精度文本表示。因此,在阅读时提取这些内容是合适的。通常,您希望以存储和/或访问效率高的形式提取

如果文件太大,内容将不符合内存,那么必须在C++中使用随机文件访问FISK或查找。对于文本行,请通读以查找行起点的偏移量。将它们存储在一个数组中作为行索引。通过使用适当的索引项查找行开始,访问行。然后读到下一行。索引将是每行8字节加上一行的缓冲区。如果文件非常大,那么您可以将索引存储在文件中,并在每行中查找两次访问。最好将索引和数据放在不同的磁盘驱动器上,以减少寻道时间。消除索引的另一个选项是要求所有行具有相同的长度,这样算术就足以找到任何行

只有在处理一行时维护一个打开的文件成本过高时,选项2才有意义。事实上永远不会是这样。对于n个单位的文件,代码必须读取^2个单位的数据。问题越大,性能就越差。由于文件IO通常是程序的瓶颈,因此这可能非常糟糕


此外,文件打开和关闭是相当昂贵的操作,不能随意进行。我曾经在一个大型模拟系统上工作,有人问我是否可以加快速度。事实上,考虑到它正在做的事情,它看起来太慢了。经过几周的逆向工程代码,我终于发现在事件循环中,每次迭代都会打开一个跟踪文件进行追加并关闭一次。我把开环和关环移到了环外,在环内添加了一个偶然的冲洗来替换,哇!模拟速度提高了20倍或更多。客户很乐意这么说。

如果可以,请使用1。如果必须,请使用3。永远不要使用2

为什么??选项1仅将存储器用于单行缓冲区。它只遍历文件一次。由于打开的文件通常不是昂贵的资源,因此它可能是最便宜、最简单的资源

然而,选项1并不总是足够的。有时您需要以随机顺序处理行。这里是选项3最好的地方。在这种情况下,如果有足够的内存,读取整个文件并将内容提取到内存中是最简单的方法。在许多情况下,字符串数组就足够了。在您的中,行似乎包含双精度文本表示。因此,在阅读时提取这些内容是合适的。通常,您希望以存储和/或访问效率高的形式提取

如果文件太大,内容将不符合内存,那么必须在C++中使用随机文件访问FISK或查找。对于文本行,请通读以查找行起点的偏移量。将它们存储在一个数组中作为行索引。通过使用适当的索引项查找行开始,访问行。然后读到下一行。索引将是每行8字节加上一行的缓冲区。如果文件非常大,那么您可以将索引存储在文件中,并在每行中查找两次访问。最好将索引和数据放在不同的磁盘驱动器上,以减少寻道时间。消除索引的另一个选项是要求所有行具有相同的长度,这样算术就足以找到任何行

只有在处理一行时维护一个打开的文件成本过高时,选项2才有意义。事实上永远不会是这样。对于n个单位的文件,代码必须读取^2个单位的数据。对体育很不好 问题越大,性能越好。由于文件IO通常是程序的瓶颈,因此这可能非常糟糕


此外,文件打开和关闭是相当昂贵的操作,不能随意进行。我曾经在一个大型模拟系统上工作,有人问我是否可以加快速度。事实上,考虑到它正在做的事情,它看起来太慢了。经过几周的逆向工程代码,我终于发现在事件循环中,每次迭代都会打开一个跟踪文件进行追加并关闭一次。我把开环和关环移到了环外,在环内添加了一个偶然的冲洗来替换,哇!模拟速度提高了20倍或更多。客户很高兴至少这么说。

我几乎想投票以复制的形式结束:,因为我想说迭代确实是对您所问问题的正确答案。我几乎想投票以复制的形式结束:,因为我想说迭代确实是你问的问题的正确答案。根据我的经验,选项3在文件读取方面是最快的,尽管正如你所说的,它消耗的内存更多。考虑到计算似乎要比读取文件花费更长的时间,我认为内存可能比性能更重要。所以+1,我认为选项1在这里可能是最好的。根据我的经验,选项3在文件读取方面是最快的,尽管正如您已经说过的,它消耗的内存更多。考虑到计算似乎要比读取文件花费更长的时间,我认为内存可能比性能更重要。所以+1,我认为选项1在这里可能是最好的。
string line; 
fstream myfile;
int numlines = 1000;
for(int i = 0; i < numlines; i++){
    myfile.open("myfile.csv");
    for(int j = 0; j < i+1; j++)
        getline(myfile, line); 
    myfile.close();
    // do something using read data
};
string line; 
fstream myfile;
int numlines = 1000;
double data[numlines][30];
myfile.open("myfile.csv");
for(int i = 0; i < numlines; i++){
    getline(myfile, line);
    // split by comma, store in data[][]
} 
myfile.close();      
for(int i = 0; i < numlines; i++){
    // do something using data[i][]
};