gpt4 book ai didi

python - 压缩文件上的高效 numpy.fromfile?

转载 作者:太空狗 更新时间:2023-10-29 20:26:09 25 4
gpt4 key购买 nike

我有一些大文件(甚至压缩到 10GB 左右),其中包含一个 ASCII header ,然后原则上每个大约 3MB 的 numpy.recarrays,我们称它们为“事件”。我的第一种方法是这样的:

f = gzip.GzipFile(filename)
f.read(10000) # fixed length ascii header
event_dtype = np.dtype([
('Id', '>u4'), # simplified
('UnixTimeUTC', '>u4', 2),
('Data', '>i2', (1600,1024) )
])
event = np.fromfile( f, dtype = event_dtype, count=1 )

但是,这是不可能的,因为 np.fromfile 需要一个真正的 FILE 对象,因为它确实进行了低级调用(找到了一张很旧的票 https://github.com/numpy/numpy/issues/1103 )。

据我所知,我必须这样做:

s = f.read( event_dtype.itemsize )
event = np.fromstring(s, dtype=event_dtype, count=1)

是的,它有效!但这不是非常低效吗?不是为 s 分配内存,并为每个事件收集垃圾吗?在我的笔记本电脑上,我达到了 16 个事件/秒,即 ~50MB/s

我想知道是否有人知道一个聪明的方法,分配内存一次,然后让 numpy 直接读入该内存。

顺便说一句。我是一名物理学家,所以……在这个行业还是个新手。

最佳答案

@Bakuriu 可能是正确的,这可能是一个微优化。你的瓶颈几乎肯定是IO,然后就是解压。两次分配内存可能并不重要。

但是,如果您想避免额外的内存分配,您可以使用 numpy.frombuffer 将字符串视为 numpy 数组。

这避免了重复内存(字符串和数组使用相同的内存缓冲区),但默认情况下数组将是只读的。然后,如果需要,您可以将其更改为允许写入。

在您的情况下,只需将 fromstring 替换为 frombuffer 即可:

f = gzip.GzipFile(filename)
f.read(10000) # fixed length ascii header
event_dtype = np.dtype([
('Id', '>u4'), # simplified
('UnixTimeUTC', '>u4', 2),
('Data', '>i2', (1600,1024) )
])
s = f.read( event_dtype.itemsize )
event = np.frombuffer(s, dtype=event_dtype, count=1)

只是为了证明使用这种方法不会复制内存:

import numpy as np

x = "hello"
y = np.frombuffer(x, dtype=np.uint8)

# Make "y" writeable...
y.flags.writeable = True

# Prove that we're using the same memory
y[0] = 121
print x # <-- Notice that we're outputting changing y and printing x...

这会产生:yello 而不是 hello

无论在这种特定情况下它是否是一项重要的优化,它都是一种需要注意的有用方法。

关于python - 压缩文件上的高效 numpy.fromfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15966335/

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