请参阅下面的重要更新
在深入研究 python 2.7 源代码后,我找到了一个简单的解决方案:因为io.BytesIO()
返回一个文件描述符,它有一组标准函数,包括tell()
.
请注意,间接方法如len(fd.getvalue())
or fd.getbuffer().nbytes
将缓冲区复制出来,然后计算缓冲区大小。在我的例子中,当缓冲区占用 1/2 的内存时,这最终会导致应用程序崩溃:/
相反fd.tell()
只需报告描述符的当前位置,不需要任何内存分配!
请注意,两者sys.getsizeof(fd)
, fd.__sizeof__()
do not返回正确的缓冲区大小。
>>> 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
UPDATE
在@admaster和@Artemis评论之后,我意识到,在预设缓冲区的情况下,正确的方法是将指针移动到缓冲区的末尾。标准seek
函数可以做到这一点,它将报告当前缓冲区大小
buffsize = fd.seek(0,2)
那么这里应该如何做到没有不必要的应对记忆
from io import BytesIO
x = BytesIO(b'AAAAAA')
x.tell() # returns 0
x.seek(0,2) # returns 6
# However
x = BytesIO()
x.write(b'AAAAAA')
x.tell() # returns 6
x.seek(0,2) # returns 6