我有一个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),则可以逐行读取和处理:
以块处理文件不一定要难看,比如:
在您的例子中,如果您知道每个输入(当前电压对)的大小,那么可以将块作为原始字节加载,而不是对原始数据执行一些条件。你知道吗
如果它需要内存映射,我不能百分之百肯定numpy的memmap,但我记得我使用了一个名为mmap的Python库(很久以前就用过)来处理非常大的文件。如果我没记错的话,它是通过一个叫做“分页”的操作系统进程来实现的。你知道吗
这种尝试的有效性将取决于您的操作系统是否支持它,以及它在遍历文件时处理垃圾回收的能力,但我认为在理论上,使用mmap有可能超过Python的内存限制。你知道吗
编辑:另外,除非你使用64位操作系统,否则mmap-large-file不会工作,因为它使用相同的地址空间将文件映射到内存。你知道吗
相关问题 更多 >
编程相关推荐