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

2024-10-06 12:48:54 发布

您现在位置: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"),("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,但我不确定这是否会创建一个新变量,或者它是否将它们堆叠到位


Tags: 文件数据path内存osfilesfnbinary