【问题标题】:Is there a way to get rows from a CSV without loading the whole file?有没有办法在不加载整个文件的情况下从 CSV 获取行?
【发布时间】:2021-11-04 22:12:33
【问题描述】:

我有一个 4GB 大小的 CSV 文件。当我尝试打开它时,我得到“内存不足”,尽管我有 16GB 的内存并且它不会消耗所有内存。我只需要从文件中获取一些随机行来可视化。有什么办法可以做到吗?

【问题讨论】:

  • 请使用正确的、国际认可的 SI 单位。 GB=千兆字节。 Gb=千兆。 gb=?
  • 您能否安装任何有用的东西,例如 WSL "Windows Subsystem for Linux"gawk,以使您的 Windows 机器更有用?
  • 你可能会接受这个答案stackoverflow.com/a/65841115/2836621,当你得到每一行时,生成一个介于 0..100 之间的随机数,如果它小于 5,则打印该行。这样一来,您将在新文件中获得大约 5% 的原始文件行数。
  • 我知道 CSV 文件默认与 Windows 上的 Excel 相关联,因为 Microsoft 认为它们应该如此。但请不要混淆这两者。 Excel 文件是 XLSXXLS 和其他一些文件。 CSV 文件通常是 TEXT,可以被许多工具打开/解析,包括流阅读器。
  • 同意@MarkSetchell,替代方案是AWK

标签: excel windows csv file memory


【解决方案1】:

显然您的文件已经增长到 Excel(根据您的评论也是 Python)无法再处理该文件了。

所以我建议你另一种方法:命令行工具。

  1. 您可以开始使用 Powershell:批处理非常困难,而且可能性非常有限。
  2. 另一种方法是类 UNIX 命令行工具。您可以通过在 PC 上安装 Cygwin(UNIX 命令,重写为 Windows(命令行)程序)或 WSL(适用于 Linux 的 Windows 子系统)来实现这些目标,这意味着您在 PC 上安装 Linux 应用程序。

在我的 PC 上,我有 WSL,我尝试计算 4Gb CSV 文件中的条目数量,我在 2-3 秒内得到了答案(不占用我的 RAM 内存)。

你所说的功能(显示一些随机行),我只是显示了第 100,000 行如下:

tail -n 100000 test.csv | head -n 1

时间消耗:几乎立即
RAM 内存消耗:可以忽略不计。

【讨论】:

  • 谢谢,这行得通。我使用 shuf 而不是 tail,我认为它可以按我的意愿工作,也可以快速工作。但显然我错了,因为我可以使用 Python 来读取文件。
【解决方案2】:

由于您似乎有 Python 可用,您当然可以使用 Python 一次读取文件一行,如下所示:

from random import randint

with open('YourFile.csv') as f:
    for line in f:
        if randint(1,100) > 99:
            print(line)

由于 1..100 之间大约 1% 的随机数将超过 99,这将导致 1% 的行抽样。如果您也希望它们以随机顺序排列,我会在采样后对其进行洗牌,这样您可以洗牌的数据就会少得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2021-04-10
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2019-10-01
    相关资源
    最近更新 更多