请查看下面的重要更新
在研究Python 2.7源代码后,我找到了一个简单的解决方案:因为io.BytesIO()
返回文件描述符,它具有一组标准函数,包括tell()
。
请注意,间接方法(例如len(fd.getvalue())
或fd.getbuffer().nbytes
)会将缓冲区复制出来,然后计算缓冲区大小。在我的情况下,当缓冲区占用内存的一半时,这最终导致应用程序崩溃 :/
相反,fd.tell()
仅报告描述符的当前位置,不需要任何内存分配!
请注意,sys.getsizeof(fd)
和fd.__sizeof__()
都不会返回正确的缓冲区大小。
>>> from io import BytesIO
>>> from sys import getsizeof
>>> with BytesIO() as fd:
... for x in xrange(200):
... fd.write(" ")
... print fd.tell(), fd.__sizeof__(), getsizeof(fd)
1 66 98
2 66 98
3 68 100
4 68 100
5 70 102
6 70 102
.....
194 265 297
195 265 297
196 265 297
197 265 297
198 265 297
199 265 297
200 265 297
更新
在 @admaster 和 @Artemis 的评论后,我意识到,在预设缓冲区的情况下,正确的方法是将指针移动到缓冲区的末尾。标准的 seek
函数可以做到这一点,并且它会报告当前缓冲区的大小。
buffsize = fd.seek(0,2)
所以这里是如何在不必要地复制内存的情况下完成它
from io import BytesIO
x = BytesIO(b'AAAAAA')
x.tell()
x.seek(0,2)
x = BytesIO()
x.write(b'AAAAAA')
x.tell()
x.seek(0,2)
BytesIO
对象的大小,而是底层缓冲区的字节数。但是,为什么你不直接尝试在 Python 2 中是否可以使用len(object.getvalue())
呢? - juanpa.arrivillagaio.BytesIO
对象。 - juanpa.arrivillagasys.getsizeof(object)
也不等同于。 - juanpa.arrivillaga