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

Python 为什么熊猫数据帧消耗的内存比原始文本文件大得多?,python,pandas,Python,Pandas,我正在尝试使用pandaspd.read\u csv(“file.txt”,sep=“\t”)将一个大的tab/txt(大小=3 gb)文件导入Python。我加载的文件是一个“.tab”文件,我将其扩展名改为“.txt”,以便使用read\u csv()导入它。它是一个包含305列和+/-1000行的文件 当我执行代码时,一段时间后Python返回一个MemoryError。我搜索了一些信息,这基本上意味着没有足够的RAM可用。当我在read\u csv()中指定nrows=20时,它工作正常

我正在尝试使用pandas
pd.read\u csv(“file.txt”,sep=“\t”)
将一个大的tab/txt(大小=3 gb)文件导入Python。我加载的文件是一个“.tab”文件,我将其扩展名改为“.txt”,以便使用
read\u csv()
导入它。它是一个包含305列和+/-1000行的文件

当我执行代码时,一段时间后Python返回一个MemoryError。我搜索了一些信息,这基本上意味着没有足够的RAM可用。当我在
read\u csv()
中指定
nrows=20
时,它工作正常

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

我的问题:一个3gb的文件怎么可能需要超过20gb的RAM才能使用pandas
read\u csv()
导入Python?我做错什么了吗

编辑:执行
df.dtypes
时,类型是
对象
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
summared\u cols=pd.DataFrame(列=[“示例”,“读取和”])

当xPandas正在剪切文件并单独存储数据时。我不知道数据类型,所以我将假设最坏的情况:字符串

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


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

你检查过这个吗?谢谢你的链接!搜索信息时未弹出此窗口!一种可能的解决方案是分块读取文件。请参阅。@Alcorriea我也考虑过这个解决方案,但由于我必须计算整个列的总和,因此加载一大块行似乎不是一个好的解决方案。在列上迭代(请参阅我的更新)非常有效。谢谢您的回复!当我执行
类型时(df[df.columns[1]][5]]
(1和5是任意数字)python返回的
仅证明了一列。请检查
df.dtypes
。如果其中任何一列是
object
,则该列存储为python对象。另一种可能性是……您确实需要比您拥有的内存更多的内存。文件中有多少行?我为df.dtypes编辑了我的原始帖子。在编写故事时会产生什么后果作为
object
object
dtype表示它存储为Python对象。
sys.getsizeof(1)
将告诉您(至少在我的计算机上)Python表示一个具有28字节内存的整数。
sys.getsizeof(“”)
将证实我之前所说的Python字符串。但是,
np.float64
np.int64
每个字符串只使用8个字节(=64位)。对于我来说,Python返回以下内容:
sys.getsizeof(“object”)
=31-
sys.getsizeof(“float64”)
=32-
sys.getsizeof(“int64”)
=30。这些数字远高于您的值?这怎么可能?