2016-12-02 2 views
1

könnte diese Frage aussehen albern, aber ich habe einen /tmp/size.txt mit diesem Inhalt:Warum sys.getsizeof ist nicht gleich os.path.getsize?

hello 

und os.path.getsize('/tmp/size.txt') sagt 6 aber wenn ich tun:

sys.getsizeof(b'hello') 
# OR 
sys.getsizeof(bytes(bytearray('hello'))) 
# OR 
sys.getsizeof(bytes('hello')) 

kehrt 42.

Was ist der Unterschied zwischen den os.path.getsize und sys.getsizeof?

+1

'getsizeo()' gibt die Größe der Objektabfragen im Speicher einschließlich des strukturellen Aufwands zurück. Es ist oft größer als die in diesem Objekt gespeicherten Daten. In Ihrem Fall sollte 'len()' hilfreicher sein. –

Antwort

2

Die beiden sind in Python nicht kompatibel. os.path.getsize geben die Größe einer Datei an, während sys.getsizeof die Größe eines Objekts angibt.

Die Datei ist 6 Bytes, nicht 5, wegen einer Zeilenendung (unter Windows könnte es 7 Bytes sein). Wenn Sie C verwenden, dann wäre "Hallo" 6 Bytes, weil eine binäre Null '\0' das Ende der Zeichenfolge markiert. Wenn Sie eine andere Sprache verwenden würden, hätte dies auch einen eigenen Verwaltungsaufwand für den Red-Band-Speicher.

Der von den Daten belegte Speicher ist (im Allgemeinen) kleiner als der von einem Objekt belegte Speicher. Ein Objekt enthält weitere Informationen zu den Daten, z. B. ihre Größe und ihren Speicherort. Es ist ein Preis, den Sie für die Verwendung einer höheren Sprache bezahlen.

+0

und wie finde ich die Dateigröße eines Objekts im Speicher? sagen Sie ein Bytearray –

+0

Größe eines Objekts der Größe seiner Daten? Nicht das Gleiche! 'sys.getsizeof' gibt die Größe eines Objekts einschließlich seiner Daten an. Die Größe der Daten ist akademisch und abhängig von der Implementierung. Warum brauchen Sie es? – cdarke

+0

Nun, sagen wir, ich habe 'Bytes (Bytearray ('hi'))' und ich möchte die Dateigröße dieses Bytearray bestimmen, wenn ich es auf Festplatte schreibe. Tatsache ist, dass ich das Objekt im Speicher habe, aber ich möchte es nicht schreiben, um die tatsächliche Dateigröße auf der Festplatte zu erhalten. –

0

os.path.getsize gibt die Dateigröße in Byte zurück.

sys.getsizeof gibt die Anzahl der Bytes zurück, die zum Speichern des Objekts str/bytes im Speicher benötigt werden. (was aufgrund von Strukturdaten einen Overhead über den tatsächlichen Inhalt hat).

+0

in Ordnung, und wie kann ich die Dateigröße eines Objekts im Speicher finden? sagen wir ein Bytearray –

+0

'sys.getsizeof' wird die Menge an Speicher zurückgeben, die das Objekt aufnimmt. –

+0

"Dateigröße eines Objekts im Speicher" ist nicht wirklich sinnvoll. Dies hängt davon ab, wie Sie das Objekt im Speicher speichern und wie Sie es in der Datei speichern, die nicht identisch sein muss. Sie könnten nach der Größe der Daten fragen, die im Objekt gespeichert sind - wenn das gemessen werden kann, gibt es dort möglicherweise eine Antwort ... – kratenko

Verwandte Themen