Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取go中文本文件的随机行_Go_Random Access - Fatal编程技术网

读取go中文本文件的随机行

读取go中文本文件的随机行,go,random-access,Go,Random Access,我正在使用编码/csv读取和解析一个非常大的.csv文件。 我需要随机选择行并通过一些测试。 我目前的解决方案是像这样读取整个文件 reader := csv.NewReader(file) lines, err := reader.ReadAll() 然后从行中随机选择行 显而易见的问题是,阅读整本书需要很长时间,而且我需要大量的记忆 问题: 我的问题是,encoding/csv给了我一个io/reader有没有办法用它来读取随机行,而不是一次加载整个内容? 这与其说是一个实际问题,不如说是

我正在使用
编码/csv
读取和解析一个非常大的.csv文件。
我需要随机选择行并通过一些测试。
我目前的解决方案是像这样读取整个文件

reader := csv.NewReader(file)
lines, err := reader.ReadAll()
然后从
行中随机选择行

显而易见的问题是,阅读整本书需要很长时间,而且我需要大量的记忆

问题:
我的问题是,
encoding/csv
给了我一个
io/reader
有没有办法用它来读取随机行,而不是一次加载整个内容?

这与其说是一个实际问题,不如说是一个好奇的问题,因为最终很可能是一次读取并在内存中访问它更有效,继续在磁盘上搜索随机行。

encoding/csv
不会给您一个
io.Reader
它会给您一个
csv.Reader
(请注意,
csv.NewReader
[1]的定义中缺少包限定,表明它返回的
读取器
属于同一个包

csv.Reader
只实现您在那里看到的方法,因此除了编写自己的csv解析器之外,似乎没有其他方法可以实现您想要的功能


[1]

最简单的解决方案是在阅读每一行时做出决定,是测试它还是扔掉它……随机做出决定,这样就不需要将整个内容都保存在RAM中……然后在运行测试后通过文件……您也可以使用非随机分布测试执行相同的方式(例如,在X字节或X行之后等)

我的建议是预先随机输入文件,例如使用shuf

然后,您可以根据需要简单地读取前n行


这不会帮助您了解更多有关io/读卡器的信息,但可能会解决您的问题。

Apokalyptik的答案与您想要的最接近。读卡器是拖缆,因此您不能随意跳到某个地方(本质上)

天真地选择在阅读时保留任何给定行的概率可能会导致问题:您可能在没有保留足够的输入行的情况下到达文件末尾,或者您可能太快保留行而无法获得好的示例。这两种情况都比正确猜测的可能性大得多,因为您事先不知道有多少行在文件中(除非先迭代一次以计数)

你真正需要的是


基本上,一行一行地阅读文件。每一行,你都可以选择是否这样拿着它:你读的第一行,你有机会拿着它。在你读了第二行之后,你有机会用这一行替换你拿着的。在第三行之后,你有机会拿着它因此,你有机会抓住任何一行,其中,
N
是你读入的行数。这里有一个(不要仅仅根据我在这一段中告诉你的来实现它)。

我有一个类似的需求:随机阅读(具体)我写了一个我调用的包来完成这个任务

它首先读取整个文件一次,并标记每行的字节偏移量(它将此信息存储在内存中,但不存储整行)

当您请求行号时,它将透明地查找到正确的偏移量,并为您提供csv解析的行


(请注意,作为第二个参数传递给ramcsv.New的csv.Reader参数仅用于将设置复制到新的读取器中。)毫无疑问,这可以提高效率,但它足以满足我的需要,并使我免于将~20GB的文本文件读入内存。

你说得对,但要清楚,
csv.Reader
实现了
io.Reader
,因此
csv.Reader
实际上也是
io.Reader