6.5 GB文件中的Pandas read_csv消耗超过170GB RAM

时间:2015-01-29 16:38:24

标签: python parsing pandas numpy ipython

我想提起这件事,只是因为它很疯狂。也许韦斯有一些想法。该文件非常规则:1100行x~3M列,数据以制表符分隔,仅由整数0,1和2组成。显然,这不是预期的。

如果我预先填充如下数据帧,则会消耗~26GB的RAM。

h = open("ms.txt")
header = h.readline().split("\t")
h.close()
rows=1100
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)

系统信息:

  • python 2.7.9
  • ipython 2.3.1
  • numpy 1.9.1
  • pandas 0.15.2。

欢迎任何想法。

2 个答案:

答案 0 :(得分:6)

你的例子的问题。

小规模地尝试使用代码,即使您设置了dtype=int,我也会注意到,您实际上在结果数据框中最后得到dtype=object

header = ['a','b','c']
rows = 11
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)

df.dtypes
a    object
b    object
c    object
dtype: object

这是因为即使您为pd.read_csv函数提供列为dtype=int的指令,它也不能覆盖最终由列中的数据确定的dtypes。

这是因为pandas是tightly coupled numpy和numpy dtypes。

问题是,您创建的数据框中没有数据,因此numpy默认数据为np.NaN不适合整数。

这意味着numpy会混淆并默认返回到object的dtype。

对象dtype的问题。

如果将dtype设置为整数或浮点数,则将dtype设置为object意味着内存消耗和分配时间会产生很大的开销。

您的示例的解决方法。

df = pd.DataFrame(columns=header, index=range(rows), dtype=float)

这很好用,因为np.NaN可以存在于浮点数中。这会产生

a    float64
b    float64
c    float64
dtype: object

并且应该减少记忆。

有关如何与dtypes相关的更多信息

有关dtype的详细信息,请参阅此相关帖子: Pandas read_csv low_memory and dtype options

答案 1 :(得分:0)

我今天面对的3 GB数据遇到的类似问题,我的编码风格几乎没有变化,而不是我在下面的代码中使用的file.read()和file.readline()方法,下面的代码只是加载1 ram中的某一行

import re

df_list = []

with open("ms.txt", 'r') as f:
    for line in f:
        #process(line)
        line = line.strip()
        columns = re.split("\t", line, maxsplit=4) # you should modify these according to your split criteria
        df_list.append(columns)

以下是将数据转换为pandas数据帧的代码。

import pandas as pd
df = pd.DataFrame(df_list)# here you will have to modify according to your data frame needs