gpt4 book ai didi

python - 为什么将 pickle 文件加载到内存中会占用更多空间?

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:31 24 4
gpt4 key购买 nike

我有一个文件夹包含 7603 个由 pickle.dump 保存的文件。平均文件大小为 6.5MB,因此文件占用的总磁盘空间约为 48GB

每个文件都是通过pickle一个list对象得到的,list的结构为

[A * 50] 
A = [str, int, [92 floats], B * 3]
B = [C * about 6]
C = [str, int, [92 floats]]

我使用的电脑内存是128GB

但是,我无法通过此脚本将文件夹中的所有文件加载到内存中:

import pickle
import multiprocessing as mp
import sys
from os.path import join
from os import listdir
import os

def one_loader(the_arg):
with open(the_arg, 'rb') as source:
temp_fp = pickle.load(source)
the_hash = the_arg.split('/')[-1]
os.system('top -bn 1 | grep buff >> memory_log')
return (the_hash, temp_fp)

def process_parallel(the_func, the_args):
pool = mp.Pool(25)
result = dict(pool.map(the_func, the_args))
pool.close()
return result

node_list = sys.argv[-1]
db_path = db_path
the_hashes = listdir(db_path)
the_files = [join(db_path, item) for item in the_hashes]
fp_dict = {}
fp_dict = process_parallel(one_loader, the_files)

我已经绘制了内存使用情况,正如您从脚本中看到的那样,内存使用情况是

enter image description here

我对这个情节有几个困惑:

  1. 4000 个文件占用 25GB 磁盘空间,但为什么它们占用超过 100GB 内存?

  2. 在内存使用率突然下降后,我没有收到任何错误,而且我可以使用 top 命令看到脚本仍在运行。但我完全不知道系统在做什么,其余的内存在哪里。

最佳答案

那是因为序列化数据占用的空间比运行时管理对象所需的内存空间要少。

字符串示例:

import pickle

with open("foo","wb") as f:
pickle.dump("toto",f)

foo 在磁盘上是 14 个字节(包括 pickle header 或其他)但在内存中它要大得多:

>>> import sys
>>> sys.getsizeof('toto')
53

对于字典来说更糟,因为哈希表(和其他东西):

import pickle,os,sys

d = {"foo":"bar"}
with open("foo","wb") as f:
pickle.dump(d,f)
print(os.path.getsize("foo"))
print(sys.getsizeof(d))

结果:

27
288

所以比例为 1 比 10。

关于python - 为什么将 pickle 文件加载到内存中会占用更多空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53941830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com