使用Go将文本文件从硬盘驱动器读入内存的最快方法是什么?

时间:2014-11-07 23:05:30

标签: perl file go

我在使用Perl多年后开始使用Go,从初始测试看起来像从硬盘驱动器读取文本文件到哈希并不像Perl那么快。

在Perl中我使用“File :: Slurp”模块,它有助于将文件快速读入内存(字符串变量,数组或散列) - 在硬盘读取吞吐量的限制内。

我不确定使用Go阅读的最佳方式是什么? 500MB CSV文件,10列到内存(哈希),其中哈希的键是第1列,值是9列的其余部分。

实现这一目标的最快方法是什么?目标是读取并存储到一些Go内存变量,就像硬盘驱动器可以提供数据一样快。

这是输入文件中的一行 - 大约有2000万条相似的行:

1341,2014-11-01 00:01:23.588,12000,AV7WN259SEH1,1133922,SingleOven / HCP / -PRODUCTION / -23C_30S,0xd8d2a106d44bea07,8665456.006,5456-02,3010-30 N- PHOTO,AV7WN259SEH1

平台是Win 7 - i7英特尔处理器,配备16GB Ram。如果这样做有好处,我也可以在Linux上安装Go。

编辑:

所以一个用例就是 - 将整个文件尽可能快地加载到内存中。后来我可以扫描该变量,拆分(全部在内存中)等。

另一种方法是在加载时间内将每一行存储为键值对(例如,在传递X咬之后或在\ N字符到达之后)。

对我来说 - 这两种方法可以产生不同的性能结果。但由于我对Golang很陌生 - 我可能需要花费数天的时间才能在Golang中尝试不同的技术。

我想了解Golang上面所有可行的方法以及推荐方法。此时我不关心内存使用情况,因为当第一个文件处理完成时,此过程将很快重复10,000次(每个文件将在处理完成后立即从内存中删除)。文件范围从50MB到500MB。由于有数千个文件 - 任何性能增益(每个文件甚至1秒增益)都是显着的整体增益。

我不想增加关于稍后将对数据做什么的问题的复杂性,但只是想了解从驱动器读取文件和以散列形式存储的最快方法。我将对我的研究结果进行更详细的基准测试,并且我将在Golang中了解更多关于不同方法的基准知识,并且我会听到更多建议。我希望有人已经就这个话题进行了研究。

1 个答案:

答案 0 :(得分:2)

ioutil.ReadFile可能是将整个文件读入内存的良好开端。话虽如此,这听起来像是对内存资源的不良使用。问题断言File :: Slurp很快,but this is not general consensus用于您正在执行的特定任务,即逐行处理。

声称Perl在某种程度上是在做事情并且快速地#34;。我们可以查看source code到Perl' File::Slurp。据我所知,它没有做任何魔法。正如斯莱德在评论中提到的那样,它只使用sysopensysread,这两者最终都归结为普通的操作系统调用。坦率地说,一旦你触摸磁盘I / O,你就输了:你唯一的希望是尽可能少地触摸它。

鉴于你的文件是500MB,你必须要读取磁盘文件的所有字节,并且你必须使用面向行的传递来处理每一行,我不明白为什么会这样#&# 39;要求两次通过这样做。为什么要将这从基本上是一次通过的算法变成双遍算法呢?

如果没有您显示任何其他代码,我们无法确定您所做的是快还是慢。没有衡量标准,我们就无法说出任何实质性内容。您是否尝试首先使用bufio.Scanner()编写直接代码,然后measure performance