我最近一直在研究一个脚本,它可以获取文件,将其分块并分析每一部分。因为分块位置取决于内容,所以我需要一次读取一个字节。我不需要随机访问,只需要从头到尾线性地读取它,一边选择某些位置,然后将块的内容从上一个选定位置生成到当前位置。
使用由bytearray
包装的内存映射文件非常方便。我不生成块,而是生成块的偏移量和大小,让外部函数对其进行切片。
它也比在一个bytearray
中积累当前块更快(比在一个bytes
中积累快得多)。但我有一些问题需要解决:
Bytearray正在复制数据吗?
我以rb
和mmap
打开文件。但原则上,access=mmap.ACCESS_READ
是可变容器。这是性能问题吗?是否有我应该使用的只读容器?
因为我不会在缓冲区中累积,所以我会随机访问bytearray
(因此是底层文件)。尽管它可能是缓冲的,但根据文件大小和系统内存,恐怕会出现问题。这真的是个问题吗?
最佳答案
将一个对象转换为可变对象确实会导致数据复制。您可以使用以下方法将文件直接读取到bytearray:
f = open(FILENAME, 'rb')
data = bytearray(os.path.getsize(FILENAME))
f.readinto(data)
从http://eli.thegreenplace.net/2011/11/28/less-copies-in-python-with-the-buffer-protocol-and-memoryviews#id12
存在字符串到字节的转换,因此存在潜在的性能问题。
Bytearray是一个数组,因此它可以达到py-ssize-t-max/sizeof(pyobject*)的限制。更多信息,您可以访问
How Big can a Python Array Get?