python如何获取iobytes分配的内存长度?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (466)

这是我用来测试内存分配的代码

import pycurl
import io


url = "http://www.stackoverflow.com"
buf = io.BytesIO()


print(len(buf.getvalue()))   #here i am getting 0 as length


c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.CONNECTTIMEOUT, 10)
c.setopt(c.TIMEOUT, 10)
c.setopt(c.ENCODING, 'gzip')
c.setopt(c.FOLLOWLOCATION, True)
c.setopt(c.IPRESOLVE, c.IPRESOLVE_V4)
c.setopt(c.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0')
c.setopt(c.WRITEFUNCTION, buf.write)
c.perform()
c.close()

print(len(buf.getvalue()))    #here length of the dowloaded file


print(buf.getvalue())
buf.close()

如何通过BytesIO获得分配的缓冲区/内存长度?我在这做错了什么?python不分配固定的缓冲区长度?

提问于
用户回答回答于

我不确定你的分配缓冲区/内存长度是什么意思,但如果你想在BytesIO对象中存储用户数据的长度,你可以做

>>> bio = io.BytesIO()
>>> bio.getbuffer().nbytes
0
>>> bio.write(b'here is some data')
17
>>> bio.getbuffer().nbytes
17

但这似乎与len(buf.getvalue())您目前使用的相当。

可以使用sys.getsizeof()找到BytesIO对象的实际大小:

>>> bio = io.BytesIO()
>>> sys.getsizeof(bio)
104

或者你可能会直接调用__sizeof__()(比如sys.getsizeof()

>>> bio = io.BytesIO()
>>> bio.__sizeof__()
72

BytesIO根据需要分配内存,并进行一些缓冲:

>>> bio = io.BytesIO()
>>> for i in range(20):
...     _=bio.write(b'a')
...     print(bio.getbuffer().nbytes, sys.getsizeof(bio), bio.__sizeof__())
...
1 106 74
2 106 74
3 108 76
4 108 76
5 110 78
6 110 78
7 112 80
8 112 80
9 120 88
10 120 88
11 120 88
12 120 88
13 120 88
14 120 88
15 120 88
16 120 88
17 129 97
18 129 97
19 129 97
20 129 97
用户回答回答于

io.BytesIO()返回具有函数的标准文件对象tell()。它报告将当前描述位置,不会复制整个缓冲区以计算总大小len(bio.getvalue())bio.getbuffer().nbytes。获取缓冲区对象中已用内存的确切大小是一种非常快速和简单的方法。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励