我正在尝试使用 pandas 将一个大的 tab/txt(大小 = 3 gb)文件导入 Python pd.read_csv("file.txt",sep="\t")。我加载的文件是一个“.tab”文件,我将其扩展名更改为“.txt”以将其导入read_csv()。它是一个包含 305 列和 +/- 1 000 000 行的文件。
当我执行代码时,一段时间后 Python 返回一个 MemoryError。我搜索了一些信息,这基本上意味着没有足够的可用 RAM。当我指定nrows = 20的read_csv()它工作正常。
我使用的计算机有 46gb 的 RAM,其中大约 20gb 可用于 Python。
我的问题:3gb 的文件怎么可能需要超过 20gb 的 RAM 才能使用 pandas 导入 Python read_csv()?我做错了什么吗?
编辑:在执行df.dtypes该类型的混合object,float64以及int64
更新:我使用以下代码来解决这个问题并执行我的计算:
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
Run Code Online (Sandbox Code Playgroud)
它现在选择一列,执行计算,将结果存储在数据框中,删除当前列,然后移动到下一列
Ama*_*dan 10
Pandas 正在切割文件,并单独存储数据。我不知道数据类型,所以我会假设最坏的情况:字符串。
在 Python 中(在我的机器上),一个空字符串需要 49 个字节,如果是 ASCII,则每个字符需要一个额外的字节(如果是 Unicode,则为 74 个字节,每个字符需要额外的 2 个字节)。对于一行 305 个空字段,这大约是 15Kb。一百万半这样的行将占用大约 22Gb 的内存,而它们在 CSV 文件中将占用大约 437 Mb。
Pandas/numpy 擅长处理数字,因为它们可以非常紧凑地表示数字系列(就像 C 程序一样)。一旦您远离 C 兼容的数据类型,它就会像 Python 一样使用内存,这……不是很节俭。