Python 获取满足条件的超大memmap中下一个元素的索引

Python 获取满足条件的超大memmap中下一个元素的索引,python,iterator,numpy-memmap,Python,Iterator,Numpy Memmap,我有一个memmap到一个非常大(10-100GB)的文件,其中包含电流和电压数据。从给定的起始指数,我想找到电压满足给定条件的下一点的指数 对于相对较小的列表,我可以使用如下迭代器: filename = '[redacted]' columntypes = np.dtype([('current', '>f8'), ('voltage', '>f8')]) data = np.memmap(filename, dtype=columntypes) current = data['

我有一个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的方式实现这一点?我总是可以采取丑陋的方法,读取大量数据并循环浏览,直到找到我需要的索引,但这似乎不雅观

如果文件具有换行符格式(如空格/新行分隔.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
如果它需要内存映射,我不是100%确定numpy的memmap,但我记得使用了一个名为mmap的Python库(很久以前就使用过)来处理非常大的文件。如果我没记错的话,它是通过一个叫做“分页”的操作系统进程来实现的

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


编辑:此外,除非您使用64位操作系统,否则mmap大文件无法工作,因为它使用相同的地址空间将文件映射到内存。

直观地说,没有其他方法-所需的元素也可以位于数据的最末端。复杂性是O(n),唯一的解决方法是先创建索引,这样就可以立即识别所需的块。这似乎是对
mmap
的误解
mmap
允许您在访问文件时按需读取文件的小部分。但是,除非您显式卸载文件中已读取的部分,否则任何需要按定义接触整个文件的操作(如过滤)最终都会将整个文件加载到内存中。定期卸载节的工作量与编写一些帮助函数来读取块的工作量一样大,可能更多。感谢您的建议,这很有意义。