我想阅读并将大型CSV文件存储到地图中。我开始只是阅读文件,看看处理需要多长时间。这是我的循环:
while(!gFile.eof()){
gFile >> data;
}
我需要大约35分钟来处理包含3500万行和六列的csv文件。有什么方法可以加快速度吗?对SO来说很新,所以如果没有正确询问就道歉。
答案 0 :(得分:4)
<强>背景强>
文件是流设备或概念。读取文件的最有效用途是保持数据流(流动)。对于每笔交易都有一笔开销。数据传输越大,开销就越小。因此,目标是保持数据流动。
内存比文件访问更快
搜索内存比搜索文件快许多倍。所以,搜索一个单词&#34;或分隔符将比逐字符读取文件更快以找到分隔符。
方法1:逐行
使用std::getline
要比使用operator>>
快得多。虽然输入代码可能会读取一个数据块;您只执行一个事务来读取记录而不是每列一个事务。请记住,保持数据流动并为列搜索内存的速度更快。
方法2:阻止阅读
本着保持流流动的精神,将一块内存读入缓冲区(大缓冲区)。处理缓冲区中的数据。这比逐行读取更有效,因为您可以使用一个事务读取多行数据,从而减少事务的开销。
有一点需要注意,您可能有一个记录交叉缓冲区边界,因此您需要提出一个算法来处理它。执行惩罚很小,每个事务只发生一次(考虑这部分事务的开销)。
方法3:多线程
本着保持数据流的精神,您可以创建多个线程。一个线程负责或将数据读入缓冲区,而另一个线程处理来自缓冲区的数据。这种技术可以更好地保持数据流动。
方法4:双缓冲&amp;多线程
这采用上面的方法3并添加多个缓冲区。读取线程可以填满一个缓冲区,然后开始填充第二个缓冲区。在处理数据之前,数据处理线程将一直等到第一个缓冲区被填满。该技术用于更好地将读取数据的速度与处理数据的速度相匹配。
方法5:内存映射文件
使用内存映射文件,操作系统会根据需要处理文件读取到内存。您需要编写的代码较少,但是您无法控制何时将文件读入内存。这仍然比逐场阅读更快。
答案 1 :(得分:1)
让我们从瓶颈开始。
从磁盘读取
解码数据
存储在地图中
记忆速度
内存量