我正在处理一个项目,以处理由电子显微镜创建的数据。生成的扫描数据存储为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,但是我不确定这是否会创建新变量或是否将它们堆叠到位。