gpt4 book ai didi

python - 获取非常大的 memmap 中满足条件的下一个元素的索引

转载 作者:行者123 更新时间:2023-12-01 09:27:36 27 4
gpt4 key购买 nike

我有一个包含电流和电压数据的非常大(10-100 GB)文件的内存映射。从给定的起始索引,我想找到电压满足给定条件的下一个点的索引。

如果列表相对较小,我可以使用迭代器来完成此操作,如下所示:

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 方式执行此操作,而无需实际将数据加载到内存中?我总是可以采用丑陋的方法来读取数据 block 并循环遍历它,直到找到我需要的索引,但这看起来不优雅。

最佳答案

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

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

使用以下方法以 block 的形式处理文件不一定会很难看:

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

在您的情况下,如果您知道每个输入(当前电压对)的大小,您可以将 block 作为原始字节加载,而不是对原始数据执行一些条件。

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 不是 100% 确定,但我记得使用一个名为 mmap 的 Python 库(很久以前使用过)来处理非常大的文件。如果我没记错的话,它是通过一个名为“分页”的操作系统进程来完成此操作的。

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

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

关于python - 获取非常大的 memmap 中满足条件的下一个元素的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50241838/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com