Python无法在使用.tolist()创建列表后删除数据帧

2024-10-05 13:20:56 发布

您现在位置:Python中文网/ 问答频道 /正文

原始数据(数据框的数据类型为category、float、object)以拼花格式保存。一旦被.read\u parquet()检索为数据帧,其中一列(所有字符串)将被.tolist()转换为列表。看起来,即使数据帧被删除,其相应的内存也不会被释放,除非它创建的列表也被删除

问题: 这是因为创建的列表实际上是基于对数据帧的引用,所以删除数据帧不会释放内存中的底层数据吗?还是我错过了什么?转换为list是为了减少内存消耗(与dataframe相比)。是否可以在创建列表后从内存中释放数据帧。欢迎任何其他实现同样目标的替代方案

以下是仅删除数据帧的示例代码:

tracemalloc.start()

df = pd.read_parquet('Data.parquet')
x = df['ID'].tolist() # 2,000,000 items

print(f"memory for x: {round(sys.getsizeof(x)/(1024**2),1)} MB")
del df

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print()
for stat in top_stats[:3]:
    print(stat)
tracemalloc.stop()

输出:

memory for x: 15.3 MB

<unknown>:0: size=314 MiB, count=2000018, average=165 B
C:\Users\_\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\base.py:792: size=15.3 MiB, count=3, average=5208 KiB
<frozen importlib._bootstrap>:219: size=625 KiB, count=6291, average=102 B

以下是删除数据帧和列表的示例代码:

tracemalloc.start()

df = pd.read_parquet('Data.parquet')
x = df['ID'].tolist() # 2,000,000 items

print(f"memory for x: {round(sys.getsizeof(x)/(1024**2),1)} MB")
del df, x

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print()
for stat in top_stats[:3]:
    print(stat)
tracemalloc.stop()

输出:

memory for x: 15.3 MB

<frozen importlib._bootstrap>:219: size=625 KiB, count=6290, average=102 B
<frozen importlib._bootstrap_external>:580: size=441 KiB, count=4675, average=97 B
C:\Users\_\AppData\Local\Programs\Python\Python38\lib\site-packages\pyarrow\util.py:53: size=59.9 KiB, count=309, average=198 B

Tags: 数据内存df列表forsizecountsnapshot

热门问题