python - Pandas 是否在加载下一个 block 后从内存中释放最后一个 block ?

标签 python pandas dataframe

以下面的代码为例。假设 block 迭代器呈现 10 个 block ,for 循环 会将它们全部加载到内存中(一个接一个),或者 Python 会有效地工作,然后释放一个?

df_iter = pd.read_csv(file, chunksize=100)

for chunk in df_iter:
  chunk.to_sql(table, engine)

我使用上面的代码对大于内存的文件进行了一些测试,结果内存溢出。我在这里错过了什么吗?

最佳答案

我想我看到了您所看到的,随着循环迭代,程序中使用了越来越多的内存。我没想到会是这样。我尝试使用 tracemalloc 库跟踪当前内存,但内存使用量确实增加了。

我尝试在 for 循环之外预先分配我需要的所有内存,因此不会发生意外的内存累积,但我可能不知何故犯了错误

import pandas as pd
import numpy as np

#followed example on https://www.geeksforgeeks.org/monitoring-memory-usage-of-a-running-python-program/
import tracemalloc

#create an example csv to read back in with chunks
nrows = 1000000
out_df = pd.DataFrame({
    'age':np.random.randint(0,10,nrows),
    'height':np.random.randint(0,10,nrows),
})
out_df.to_csv('test_out.csv')

chunksize = 10000
pre_alloc_data = {i:0 for i in range(0,nrows//chunksize,10)}

# starting the monitoring 
tracemalloc.start()

df_iter = pd.read_csv('test_out.csv', chunksize=chunksize)


for i,chunk in enumerate(df_iter):
    # store the current memory usage every 10 iterations
    if i%10 == 0:
        pre_alloc_data[i] = tracemalloc.get_traced_memory()[0]
            
# stopping the library
tracemalloc.stop()

print(pre_alloc_data)

输出

{0: 1047984, 10: 1049208, 20: 1049532, 30: 1049832, 40: 1050596, 50: 1051720, 60: 1052692, 70: 1053696, 80: 1054732, 90: 1055800}

关于python - Pandas 是否在加载下一个 block 后从内存中释放最后一个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72408709/

相关文章:

python - numpy apply_along_axis 具有不同的结果大小

python - 比较两个列表的有效方法,记住每个唯一元素的来源

python pandas用数字替换数据框中的字符串

python - 属性错误 : 'module' object has no attribute 'WebSocketApp'

python - 打开两个自己的终端,运行两个脚本并等待它们完成

python - 如何替换pandas中字符串中的非数字或小数

python-2.7 - Python 2.7 pandas 填充缺失的数字/系列

python - 多线程中的 Pandas 数据框

python - 根据 pandas 数据框中的特定列以及其他列在单独的列中按计数和总和进行分组

python - 在 Python 中删除包含 NaN 的行前后的行?