我试图使用熊猫pd.read_csv("file.txt",sep="\t")将一个大型选项卡/txt (size =3GB)文件导入Python。我加载的文件是一个".tab“文件,其中我将扩展名改为".txt”,以便用read_csv()导入它。它是一个拥有305列和+/- 1000行的文件。
当我执行代码时,Python会在一段时间后返回一个MemoryError。我搜索了一些信息,这基本上意味着没有足够的RAM可用。当我在nrows = 20中指定read_csv()时,它工作得很好。
我使用的计算机有46 gb的RAM,其中大约20 gb可用于Python。
我的问题是:一个3gb的文件怎么可能需要超过20 3gb的内存才能使用熊猫read_csv()导入Python?我做错什么了吗?
编辑:在执行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它现在选择一个列,执行一个计算,将结果存储在一个dataframe中,删除当前列,然后移动到下一个列。
发布于 2019-06-19 06:51:19
熊猫正在切割文件,并将数据单独存储起来。我不知道数据类型,所以我将假设最坏的情况:字符串。
在Python (在我的机器上)中,空字符串需要49个字节,如果是ASCII,每个字符需要一个额外的字节(如果Unicode,则每个字符需要74个字节,每个字符需要额外的2个字节)。对于一排305个空域,这大约是15公斤。这类行中的100万零1行将占用大约22 Mb的内存,而在CSV文件中它们将占用大约437 Mb。
熊猫/numpy对数字很在行,因为它们可以非常紧凑地表示一个数字系列(就像C程序那样)。一旦您不再使用与C兼容的数据类型,它就会像Python一样使用内存,这就是.不太节俭。
https://stackoverflow.com/questions/56661501
复制相似问题