2016-12-02 17 views
1

この質問は、私がこのコンテンツを/tmp/size.txtを持って、愚かに見えるかもしれませんが、私が行うときなぜsys.getsizeofがos.path.getsizeと等しくないのですか?

hello 

os.path.getsize('/tmp/size.txt')6を言うが、:

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

それは42を返します。

os.path.getsizesys.getsizeofの違いは何ですか?

+1

'getsizeo()'は構造上のオーバーヘッドを含むメモリ内のオブジェクトクエリのサイズを返します。多くの場合、そのオブジェクトに格納されているデータよりも大きくなります。あなたのケースでは 'len()'がもっと役立つはずです。 –

答えて

2

2つはPythonでは互換性がありません。 os.path.getsizeはファイルのサイズを示し、sys.getsizeofはオブジェクトのサイズを示します。

ファイルは行末なので6バイトで、5バイトではありません(Windowsでは7バイトかもしれません)。 Cを使用していた場合、 "hello"は6バイトになります。これは、バイナリのゼロ'\0'が文字列の最後を示すためです。別の言語を使用していた場合、それも独自の赤テープメモリオーバーヘッドを持ちます。

データが占有するメモリは、(一般的に)オブジェクトが占有しているメモリよりも小さいです。オブジェクトには、データのサイズや場所などの他の情報が含まれます。これは、高水準言語を使用するために支払う代金です。

+0

と、メモリ内のオブジェクトのファイルサイズはどのようにして見つけることができますか? bytearray –

+0

データのサイズのオブジェクトのサイズ?同じことではありません! 'sys.getsizeof'は、データを含むオブジェクトのサイズを返します。データのサイズは学術的なものであり、実装に依存します。なぜあなたはそれが必要なのですか? – cdarke

+0

まあ、私は 'バイト(bytearray( 'hi'))'を持っているとしましょう、私はディスクに書き込む場合、このbytearrayのファイルサイズを決定したいと思います。実際には、私はオブジェクトをメモリに持っていますが、ディスク上に実際のファイルサイズを取得するためにオブジェクトを書きたくありません。 –

0

os.path.getsizeは、ファイルサイズをバイト単位で返します。

sys.getsizeofは、str/bytesオブジェクトをメモリに格納するために必要なバイト数を返します。 (構造データのために実際のコンテンツにオーバーヘッドがあります)。

+0

いいえ、どのようにしてメモリ内のオブジェクトのファイルサイズを見つけることができますか? –

+0

'sys.getsizeof'は、オブジェクトが占めるメモリの量を返します。 –

+0

"メモリ内のオブジェクトのファイルサイズ"は実際には尋ねる意味がありません。これは、オブジェクトをメモリに保存する方法と、ファイルに保存する方法(同じである必要はない)によって異なります。オブジェクトに保存されているデータのサイズを尋ねることができます。測定できる場合はそこに答えがあるかもしれません... – kratenko

関連する問題