【问题标题】:Sampling from a 6GB csv file without loading in Python从 6GB 的 csv 文件中采样而不用 Python 加载
【发布时间】:2018-03-03 12:31:49
【问题描述】:

我有一个大小为 6 GB 的 CSV 格式的训练数据集,我需要对其进行分析和实施机器学习。我的系统 RAM 为 6 GB,因此我无法将文件加载到内存中。我需要执行随机抽样并从数据集中加载样本。样品数量可根据要求而有所不同。这个怎么做?

【问题讨论】:

  • 您可以使用 Python CSV 阅读器分块加载文件并从每个块中采样。
  • Reading a huge .csv file 的可能重复项。还有其他类似的问答部分有不同的答案。
  • 是的,我试过了,但我不知道我的数据集的实际大小,所以我无法正确创建块,最终导致我的系统超载
  • 这里有很多关于 SO 的解决方案,其中一些使用 itertools.islice 来消耗未采样的行 - Itertools Recipes 中有一个 consume 函数。您应该能够使这种方法发挥作用。
  • 我也喜欢这个答案stackoverflow.com/a/6347142/2823755 - 单次遍历文件以创建行索引/位置列表。然后你寻找你想要采样的线。

标签: python csv machine-learning dataset


【解决方案1】:

开始的东西:

with open('dataset.csv') as f:
    for line in f:
        sample_foo(line.split(","))

这将在内存中一次只加载一行,而不是整个文件。

【讨论】:

  • 这是正确的答案和 pythonnic 方法。由于 python 使用生成器而不是将整个文件加载到内存中,因此不会发生内存压力。
  • 您可能还想提及使用诸如水库采样之类的东西(请参阅en.wikipedia.org/wiki/Reservoir_sampling)。虽然使用迭代器是一种节省内存的好方法,但您仍然需要一种对条目进行采样的方法。另外,是否有标题,第一行应该保存,迭代应该从第二行开始。
  • 所以我不知道数据集中的记录数,我想要一个样本大小,比如说数据集的固定百分比,“随机样本”!有可能实现吗?
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多