我在做一个项目来处理电子显微镜产生的数据。生成的扫描数据存储为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"),("all files","*.*")))
mb = MerlinBinary(bf,hf, df, row_end_skip=1)
return mb.get_memmap()
我遇到的主要问题是如何处理内存映射。它们只表示数据,而不是将数据加载到内存中。只有在内存映射上执行操作时才加载数据。例如,我可以做:
temp = getDMIFile() + 0
这将需要相当长的时间(在SSD上超过5分钟)才能完成,文件大小约为8GB
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,但我不确定这是否会创建一个新变量,或者它是否将它们堆叠到位
目前没有回答
相关问题 更多 >
编程相关推荐