使用python加载带有内存映射和多处理的大文件

我正在处理一个项目,以处理由电子显微镜创建的数据。生成的扫描数据存储为merlin二进制文件。我还使用FPD库将数据加载到内存中:

https://fpdpy.gitlab.io/fpd/convert_merlin_binary.html

这是我的功能:

def getDMIFile():
    tfp = filedialog.askopenfilename(title = "Select MERLIN file",filetypes = (("MERLIN binary files","*.mib"),("all files","*.*")))
    bp,fne = os.path.split(tfp)
    fn = os.path.splitext(fne)[0]
    bf = os.path.join(bp,fn+'.mib')
    hf = os.path.join(bp,fn+'.hdr')
    df = filedialog.askopenfilename(title = "Select *.dm3 file",filetypes = (("Digital micrograph files","*.dm3"),"*.*")))
    mb = MerlinBinary(bf,hf,df,row_end_skip=1)
    return mb.get_memmap()

我遇到的主要问题是使用内存映射。它们仅表示数据,而不是将其加载到内存中。仅在对存储器映射执行操作时才加载数据。例如,我可以这样做:

temp = getDMIFile() + 0

要花费大约8GB的文件大小,这将花费很长的时间(在SSD上超过5分钟),而

temp = getDMIFile()

立即完成(因为就像我说的那样,没有实际的数据加载到内存中!)

我有足够的内存(32GB)来处理这种大小的文件,我真的不想执行这种缓存和删除fpd库自动执行的值,以便在低规格计算机上运行,​​我会宁可具有快速的处理速度。我已经设法阻止库在每次操作后删除已缓存的数据,但是初始缓存仍然花费太长时间。有没有一种方法可以使用多重处理从内存映射中加载数据?例如为4核CPU进行以下代码的操作:

i = size/4
temp1 = getDMIFile()[:i] + 0
temp2 = getDMIFile()[i:i+1] + 0
temp3 = getDMIFile()[i+1:i+2] + 0
temp4 = getDMIFile()[i+2:] + 0

我也不确定在加载后如何将这些块堆叠到位,以便它们形成完整的数据集而不是裁剪的数据集。我知道的唯一方法是使用numpy.stack,但是我不确定这是否会创建新变量或是否将它们堆叠到位。

sguidong 回答:使用python加载带有内存映射和多处理的大文件

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3070097.html

大家都在问