2014-11-09 16 views
7

Jest to kod używam aby przetestować alokacji pamięcipython, jak uzyskać przydzieloną iobytes długość pamięci?

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() 

Jak zdobyć przydzieloną długość bufora/pamięci przez BytesIO? co ja tu robię źle? python nie przydziela ustalonej długości bufora?

+1

pokazują ślad stosu. – WeaselFox

+0

Dlaczego nie użyć bardziej przyzwoitej biblioteki klienta, na przykład ['requests'] (http://docs.python-requests.org/)? – ThiefMaster

+0

@WeaselFox nie ma błędu, po prostu chcę wiedzieć, jak uzyskać przydzieloną długość pamięci – user4046642

Odpowiedz

9

Nie jestem pewien co masz na myśli przez przydzielonego buforu/długość pamięci, ale jeśli chcesz, długość danych użytkowników przechowywanych w obiekcie BytesIO można zrobić

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

Ale to wydaje równoważne len(buf.getvalue()) którego obecnie używasz.

Rzeczywista wielkość obiektu BytesIO można znaleźć za pomocą sys.getsizeof():

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

Albo możesz być brzydki i nazywają __sizeof__() bezpośrednio (co jest jak sys.getsizeof() ale bez kolektora napowietrznych zastosowanie do przedmiotu śmieci):

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

Pamięć BytesIO jest przydzielona zgodnie z wymaganiami, a niektóre buforowanie ma miejsce:

>>> 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 
+0

Więc mówisz, że pamięć jest przydzielana dynamicznie w razie potrzeby? – user4046642

+0

@ user4046642: Tak, właśnie to próbowałem pokazać. Jeśli chcesz mieć bufor o ustalonym rozmiarze, może być coś w 'numpy', którego możesz użyć, np. 'numpy.empty (50, dtype = numpy.character)' – mhawke

Powiązane problemy