use*_*642 18 python python-3.x
这是我用来测试内存分配的代码
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()
Run Code Online (Sandbox Code Playgroud)
如何通过BytesIO获取分配的缓冲区/内存长度?我在这做错了什么?python不分配固定的缓冲区长度?
mha*_*wke 31
我不确定你的分配缓冲区/内存长度是什么意思,但如果你想要存储在BytesIO
对象中的用户数据的长度,你可以做
>>> bio = io.BytesIO()
>>> bio.getbuffer().nbytes
0
>>> bio.write(b'here is some data')
17
>>> bio.getbuffer().nbytes
17
Run Code Online (Sandbox Code Playgroud)
但这似乎与len(buf.getvalue())
您目前使用的相当.
可以使用sys.getsizeof()
以下命令找到BytesIO对象的实际大小:
>>> bio = io.BytesIO()
>>> sys.getsizeof(bio)
104
Run Code Online (Sandbox Code Playgroud)
或者你可能会讨厌并__sizeof__()
直接调用(这类似sys.getsizeof()
但没有适用于该对象的垃圾收集器开销):
>>> bio = io.BytesIO()
>>> bio.__sizeof__()
72
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
io.BytesIO()
返回一个具有函数的标准文件对象tell()
。它报告将当前描述位置,不会复制整个缓冲区以计算总大小len(bio.getvalue())
的bio.getbuffer().nbytes
。这是获取缓冲区对象中已用内存的确切大小的一种非常快速且简单的方法。
但是,如果您预设了缓冲区,tell()
将指向缓冲区的开头并返回 0,但缓冲区大小不为零。在这种情况下,您可以将指针移动到缓冲区的末尾seek(0,2)
,这将报告总缓冲区大小,而无需将整个缓冲区复制到另一个内存块中。
我在此处发布并最近更新了示例代码和更详细的答案
归档时间: |
|
查看次数: |
17490 次 |
最近记录: |