问题
我的应用程序正在提取内存中的zip文件列表,并将数据写入临时文件。然后,我将数据映射到临时文件中,以供其他功能使用。当我在单个过程中执行此操作时,它可以正常工作,读取数据不会影响内存,最大RAM约为40MB。但是,当我使用current.futures执行此操作时,RAM高达500MB。
我看了这个例子,我知道我可以以更好的方式提交作业,以节省处理过程中的内存。但是我不认为我的问题与之相关,因为我在处理过程中并没有耗尽内存。我不明白的问题是,即使返回内存映射后,为什么它仍保留在内存中。我也不了解内存中的内容,因为在单个进程中执行此操作不会将数据加载到内存中。
任何人都可以解释一下内存中的实际内容,以及为什么单处理和并行处理之间的区别吗?
我用来memory_profiler测量内存使用情况的PS
代码
主要代码:
def main():
datadir = './testdata'
files = os.listdir('./testdata')
files = [os.path.join(datadir, f) for f in files]
datalist = download_files(files, multiprocess=False)
print(len(datalist))
time.sleep(15)
del datalist # See here that memory is freed up
time.sleep(15)
其他功能:
def download_files(filelist, multiprocess=False):
datalist = []
if multiprocess:
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
returned_future = [executor.submit(extract_file, f) for f in filelist]
for future in returned_future:
datalist.append(future.result())
else:
for f in filelist:
datalist.append(extract_file(f))
return datalist
def extract_file(input_zip):
buffer = next(iter(extract_zip(input_zip).values()))
with tempfile.NamedTemporaryFile() as temp_logfile:
temp_logfile.write(buffer)
del buffer
data = memmap(temp_logfile, dtype='float32', shape=(2000000, 4), mode='r')
return data
def extract_zip(input_zip):
with ZipFile(input_zip, 'r') as input_zip:
return {name: input_zip.read(name) for name in input_zip.namelist()}
数据的辅助代码
我无法共享我的实际数据,但是以下是一些简单的代码来创建演示该问题的文件:
for i in range(1, 16):
outdir = './testdata'
outfile = 'file_{}.dat'.format(i)
fp = np.memmap(os.path.join(outdir, outfile), dtype='float32', mode='w+', shape=(2000000, 4))
fp[:] = np.random.rand(*fp.shape)
del fp
with ZipFile(outdir + '/' + outfile[:-4] + '.zip', mode='w', compression=ZIP_DEFLATED) as z:
z.write(outdir + '/' + outfile, outfile)
交互式爱情
相关分类