为什么熊猫数据帧消耗的RAM比原始文本文件大得多?

时间:2019-06-19 06:40:32

标签: python pandas

我正在尝试使用大熊猫pd.read_csv("file.txt",sep="\t")将较大的tab / txt(大小= 3 gb)文件导入Python。我加载的文件是一个“ .tab”文件,我将其扩展名更改为“ .txt”以使用read_csv()导入。这是一个具有305列和+/- 1000000行的文件。

当我执行代码时,一段时间后Python返回MemoryError。我搜索了一些信息,这基本上意味着没有足够的RAM。当我在nrows = 20中指定read_csv()时,效果很好。

我正在使用的计算机具有46gb的RAM,其中大约20gb可用于Python。

我的问题:3gb的文件如何可能需要使用熊猫read_csv()将超过20gb的RAM导入Python?我做错什么了吗?

编辑:执行df.dtypes时,类型是objectfloat64int64

的组合

更新:我使用以下代码克服了该问题并执行了计算:

summed_cols=pd.DataFrame(columns=["sample","read sum"])
while x<352:
    x=x+1
    sample_col=pd.read_csv("file.txt",sep="\t",usecols=[x])
    summed_cols=summed_cols.append(pd.DataFrame({"sample":[sample_col.columns[0]],"read sum":sum(sample_col[sample_col.columns[0]])}))
    del sample_col

现在它选择一列,执行计算,将结果存储在数据框中,删除当前列,然后移至下一列

1 个答案:

答案 0 :(得分:4)

Pandas正在分割文件,并分别存储数据。我不知道数据类型,所以我假设最糟糕的是:字符串。

在Python(在我的机器上)中,空字符串需要49个字节,如果是ASCII,则每个字符都有一个额外的字节(如果是Unicode,则是74个字节,每个字符另外需要2个字节)。一行305个空字段大约等于15Kb。一百万个这样的行将占用大约22Gb的内存,而在CSV文件中将占用437 Mb的内存。

Pandas / numpy很好地使用数字,因为它们可以非常紧凑地表示数字序列(就像C程序那样)。一旦您脱离了C兼容的数据类型,它就会像Python一样使用内存,这不是很节俭。

相关问题