gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:54:32 25 4
gpt4 key购买 nike

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

reader := csv.NewReader(file)
lines, err := reader.ReadAll()

然后从
中随机选择行明显的问题是阅读整篇文章需要很长时间,而且我需要大量内存。

问题:
我的问题是,encoding/csv 给了我一个 io/reader 有没有办法用它来读取随机行而不是一次加载整个东西?
这更多的是出于好奇,想了解更多关于 io/reader 的知识,而不是一个实际问题,因为很可能最终读取一次并在内存中访问它会更有效,而不是继续寻找磁盘上的随机行。

最佳答案

Apokalyptik 的答案最接近您想要的。读者是主播,所以你不能随便跳到一个地方(本身)。

在读入时天真地选择保留任何给定行的概率会导致问题:您可能到达文件末尾而没有保留足够的输入行,或者您可能太快保留行和得不到好的 sample 。两者都比猜对的可能性大得多,因为您事先不知道文件中有多少行(除非您先对其进行一次迭代以计算它们)。

你真正需要的是 reservoir sampling .

基本上,逐行读取文件。每一行,您都可以选择是否持有它:您阅读的第一行,您有 1/1 机会持有它。阅读第二行后,您有 1/2 的机会用这一行替换您持有的内容。在第三行之后,您有 1/2 * 2/3 = 1/3 的机会坚持使用第三行。因此,您有 1/N 的机会捕获任何给定的行,其中 N 是您已读入的行数。这里是 more detailed look at the algorithm (不要试图仅根据我在本段中告诉您的内容来实现它)。

关于go - 在go中读取文本文件中的随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22875018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com