我有一个大的 pandas 数据框(大小 = 3 GB):
x = read.table('big_table.txt', sep='\t', header=0, index_col=0)
因为我在内存限制下工作,所以我对数据帧进行了子集化:
rows = calculate_rows() # a function that calculates what rows I need
cols = calculate_cols() # a function that calculates what cols I need
x = x.iloc[rows, cols]
计算行和列的函数并不重要,但它们绝对是原始行和列的较小子集。然而,当我执行此操作时,内存使用量增加了很多!最初的目标是将内存占用量缩小到 3GB 以下,但内存使用量却远远超过 6GB。
我猜这是因为 Python 在内存中创建了数据帧的本地副本,但没有清理它。可能还发生其他事情......所以我的问题是如何对大型数据框进行子集化并清理空间?我找不到适当选择行/列的函数。
我读过很多 Stack Overflow,但找不到太多关于这个主题的内容。可能是我没有使用正确的关键字,所以如果您有建议,也可能会有所帮助。谢谢!
你最好这样做:
Specify usecols
子选择您首先想要的列read_csv
, see here https://stackoverflow.com/questions/15017072/pandas-read-csv-and-filter-columns-with-usecols.
然后分块读取文件,参见here https://stackoverflow.com/questions/11622652/large-persistent-dataframe-in-pandas/12193309#12193309,如果您想要的行被选择,则将它们分流为关闭,最后连接结果。
伪代码如下:
reader = pd.read_csv('big_table.txt', sep='\t', header=0,
index_col=0, usecols=the_columns_i_want_to_use,
chunksize=10000)
df = pd.concat([ chunk.iloc[rows_that_I_want_] for chunk in reader ])
这将具有恒定的内存使用量(块的大小)
加上所选行的使用 x 2,这将在您连接行时发生
连接后,使用率将下降到所选行的使用率
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)