【问题标题】:How to load and process dataset with million columns with Pandas or Pandas-like library?如何使用 Pandas 或类似 Pandas 的库加载和处理百万列的数据集?
【发布时间】:2021-02-01 19:52:01
【问题描述】:

我通常会发现有关使用 Dask 或 Pandas 块大小将数百万行的数据集加载到 python 的问题和讨论,但我的问题有点不同。我有数百万列/功能,只有几千条记录。我发现使用此类数据集的数据加载时间(来自 csv)非常慢,并且消耗大量内存,我做了一些基准测试,有时,pandas 甚至比 dask 还要快!

我测试了我有 100 万行和 300 列的情况,我可以轻松地将它加载到内存中,但是如果我有 300 行和 100 万列,那么 pandas 会消耗所有 64GB RAM 并死掉。

我该如何处理这样的数据集?

非常感谢。

【问题讨论】:

  • @NickODell 在我的回答中看到我的想法。如果您认为这可能是个好主意,请告诉我。不过,我认为您的回答很好。

标签: python pandas


【解决方案1】:

我测试了我有 100 万行和 300 列的情况,我可以轻松地将其加载到内存中,但是如果我有 300 行和 100 万列,那么 pandas 会消耗所有 64GB RAM 并死掉。
我该如何处理这样的数据集?

Pandas 建立在以下假设之上:

  • 一列中的所有项目都是通用数据类型,并且
  • 行数远大于列数。

如果这些假设不成立,那么 Pandas 的效率将非常低。

您可以阅读these slides 以了解 Pandas 内部的工作原理。本质上,Pandas 按类型对每一列进行专门化,为该列选择最严格的类型,这允许 Pandas 为每个单元格使用更少的内存。但是,如果行少列多,那么每列的开销会非常大。

我建议您避免像这样格式化您的数据。以下是一些无需使用 Pandas 即可转置 CSV 文件的 Python 代码:

import csv
def transpose():
    a = zip(*csv.reader(open("test.csv", "rt")))
    csv.writer(open("transposed.csv", "wt")).writerows(a)

(在我的电脑上,一个 100K x 300 的 CSV 文件需要 300MB。相比之下,在 read_csv 中正常打开它需要 900MB。)

【讨论】:

  • 谢谢,在极端情况下,当转置数据集太大而无法在内存中重新转置时,我应该如何解决?
  • @ThanhNguyen 取决于它有多大 - 我在上面发布的方法将使用 50% 的内存,您需要将整个 CSV 保存在内存中。因此,如果您的 CSV 小于 128GB,(64GB * 2),您可以这样做。如果你想变得更大,你可以尝试 David Erickson 的方法,它每次读取一个列的子集。这对 IO 和 CPU 来说效率较低,但内存效率更高。可以采用多种方法,具体取决于 CSV 的大小。
【解决方案2】:

如果您要使用 pandas,这是我在 cmets 中的想法。这是未经测试的,但您可以使用usecols 动态地在块中创建列。我在 cmets 中说 iloc,但这仍然需要先阅读整个文件,所以我的意思是 usecols。您可以调整i 和范围内的数字。

i = 10
for _ in range(1,4):
    cols = list(range(i-10,i))
    print(cols)
    df = pd.read_csv(f, usecols=cols).T
    df.append(df)
    i += 10
df = df.T

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

如您所见,您基本上可以使用这种技术按列“分块”。

【讨论】:

  • 我明白你现在的意思了。非常好的,开箱即用的答案。值得注意的是,这个答案使用了时间-内存权衡 - 您可以减少内存使用,但只能通过多次调用 read_csv,这将花费更长的时间。
猜你喜欢
  • 2019-10-07
  • 2022-09-23
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多