我想提起这件事,只是因为它很疯狂。也许韦斯有一些想法。该文件非常规则: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)
系统信息:
欢迎任何想法。
答案 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设置为object
意味着内存消耗和分配时间会产生很大的开销。
df = pd.DataFrame(columns=header, index=range(rows), dtype=float)
这很好用,因为np.NaN
可以存在于浮点数中。这会产生
a float64
b float64
c float64
dtype: object
并且应该减少记忆。
有关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