在满足一个条件的非常大的memmap中得到下一个元素的索引

2024-04-19 06:12:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个memmap到一个非常大(10-100gb)的文件,其中包含电流和电压数据。从给定的起始指数,我想找到下一个点的指数,电压满足给定的条件。你知道吗

对于相对较小的列表,我可以使用如下迭代器:

filename = '[redacted]'
columntypes = np.dtype([('current', '>f8'), ('voltage', '>f8')])
data = np.memmap(filename, dtype=columntypes)
current = data['current']
voltage = data['voltage']

condition = (i for i,v in enumerate(voltage) if voltage > 0.1)
print next(condition)

但是因为我的memmap太大了,它不能构建迭代器。有没有一种方法可以在不将数据加载到内存的情况下以pythonic的方式实现这一点?我总是可以采取一种丑陋的方法,读取大量数据并循环遍历,直到找到所需的索引,但这似乎并不雅观。你知道吗


Tags: 文件数据方法datanpcurrent指数filename
1条回答
网友
1楼 · 发布于 2024-04-19 06:12:21

如果文件具有换行符格式(如空格/新行分隔.csv),则可以逐行读取和处理:

with open("foo.bar") as f:
    for line in f:
        do_something(line)

以块处理文件不一定要难看,比如:

with open("foo.bar") as f:
    for chunk in iter(lambda: f.read(128), ""):
        do_something(chunk)

在您的例子中,如果您知道每个输入(当前电压对)的大小,那么可以将块作为原始字节加载,而不是对原始数据执行一些条件。你知道吗

sizeDataPoint = 128

index = 0

lastIndex = None

with open("foo.bar") as f:
    for chunk in iter(lambda: f.read(sizeDataPoint), ""):
        if(check_conditions(chunk)):
            lastIndex = index
        index += 1

如果它需要内存映射,我不能百分之百肯定numpy的memmap,但我记得我使用了一个名为mmap的Python库(很久以前就用过)来处理非常大的文件。如果我没记错的话,它是通过一个叫做“分页”的操作系统进程来实现的。你知道吗

这种尝试的有效性将取决于您的操作系统是否支持它,以及它在遍历文件时处理垃圾回收的能力,但我认为在理论上,使用mmap有可能超过Python的内存限制。你知道吗

编辑:另外,除非你使用64位操作系统,否则mmap-large-file不会工作,因为它使用相同的地址空间将文件映射到内存。你知道吗

相关问题 更多 >