【发布时间】:2018-12-27 08:17:37
【问题描述】:
我有一个文件夹,其中包含 pickle.dump 保存的 7603 个文件。平均文件大小为6.5MB,因此文件占用的总磁盘空间约为48GB。
每个文件都是通过pickling一个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)
我已经绘制了内存使用情况,从脚本中可以看出,内存使用情况是
我对这个情节有几个困惑:
4000 个文件占用
25GB磁盘空间,但为什么它们占用的内存超过100GB内存?在内存使用突然下降后,我没有收到任何错误,使用
top命令可以看到脚本仍在运行。但我完全不知道系统在做什么,其余的记忆在哪里。
【问题讨论】:
-
你不只是将文件加载到内存中,你还将它解压到需要更多空间的对象中。
-
这是非常特定于文件格式(磁盘和内存格式);该格式应包含在问题本身中,以使问题不要过于宽泛/笼统而不能被允许。 (我在这里进行了编辑)。也就是说,更一般地说,反序列化通常会涉及解压缩,然后几乎总是会涉及将单个流分解为一系列单独的对象。对象在内存中有开销——它们需要垃圾收集元数据;他们可能需要为快速访问创建索引;等等
-
开销多少以及开销多少的细节取决于对象是什么的细节;不存在任何通用答案,或任何通用的存储要求比率。
-
@Charles Duffy 我添加了有关被腌制对象的详细信息。
-
如果你想减小尺寸,也许使用
numpy并将浮点数据存储在float中(会损失精度,但这是可以接受的)会减小它的尺寸占用磁盘和内存