2016-11-01 3 views
1

Pythonで1バイトまたは2バイト(たとえば2または4)バイトの情報を割り当て/格納するにはどうすればよいですか?Pythonでシングルバイトのメモリを保存する方法は?

私はmalloc/newの代わりにPythonを探していませんが、膨大な量のメモリを取らないデータ型もあります。

私は以下を試しましたが、以下に示すように、すべてが大量のメモリを使用しています。

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> i = 1 ; sys.getsizeof(i) 
24 
>>> i = None ; sys.getsizeof(i) 
16 
>>> i = 'c' ; sys.getsizeof(i) 
38 
>>> i = 'good' ; sys.getsizeof(i) 
41 
>>> i = bytearray(0) ; sys.getsizeof(i) 
48 
>>> i = bytearray(1) ; sys.getsizeof(i) 
50 
>>> from struct import * 
>>> i = pack('h', 1) ; sys.getsizeof(i) 
39 
>>> i = array('l', [1]) ; sys.getsizeof(i) 
64L 

私はPythonが大好きで、100,000件のファイアウォールルールを格納するアプリケーションを作成しています。 Pythonの従来のデータ型(整数、文字列)を使用すると、各ルールは約500バイトの情報になります。私はスペースを節約し、アプリケーションの残りの部分がPython(2.7)にあるので、C/C++への切り替えを避けたいと思います。

また、私のアプリケーションはほぼ2分ごとにルールの更新や変更をチェックするため、メモリを保持することはできません。

私の考えは、情報を圧縮してメモリを節約することです。たとえば、ルールの 'direction'を文字列または整数に 'input'または 'output'または 'inout'として格納する代わりに、特定の方向をマークするために2または3ビットを割り当てます。これで私のルール情報を10バイト以下に保存できると仮定しています。このために、2/4バイトの情報しか格納しない方法を知りたい。

フィードバック/提案/参考情報をお待ちしています。

+4

正しい問題に取り組んでいることを確認するだけで、100kルールが同時にメモリに保存されるようにアプリケーションを作成していますか? – Brian

+2

それぞれを500バイトずつ保存しても、500 * 100000/1024^2 MB(47.7MB)に過ぎません。場合によっては、Google Chromeのタブで100MB以上を使用します。 – Aurora0001

+0

@Brian後ほどお話したように、2分ごとにルールの変更を確認する必要があるため、メモリを維持しないようにしたいと考えています。だから私は他のアドバイスされた方法がない限り、情報をメモリに保持しなければならないと思います。 – ViFI

答えて

0

サイズの測定では、格納されているデータのサイズから基礎となるクラスオーバーヘッドを除外していませんでした。たとえば、bytearrayには約48バイトのオーバーヘッドがありますが、追加される各バイトには約1バイトが必要です。私は50バイトから53から56へのジャンプがメモリアクセスの最適化を示していると推測します。

>>> i = bytearray() 
>>> sys.getsizeof(i) 
48 
>>> i = bytearray((1)) 
>>> sys.getsizeof(i) 
50 
>>> i = bytearray((1,2)) 
>>> sys.getsizeof(i) 
53 
>>> i = bytearray((1,2,3)) 
>>> sys.getsizeof(i) 
53 
>>> i = bytearray((1,2,3,4)) 
>>> sys.getsizeof(i) 
53 
>>> i = bytearray((1,2,3,4,5)) 
>>> sys.getsizeof(i) 
56 
+0

私はそれを観察したが、このオーバーヘッドを避ける方法を知らなかった。それは疑問の別の見出しかもしれないが、それがさらに多くのdownvotesを引き付けるだろうと私は恐れている!! – ViFI

+0

@ViFIおそらく、いくつかのサンプルデータを持つ新しい投稿と、「このデータを最もコンパクトに保存するにはどうすればよいですか?ただし、データを解凍するのに必要な時間は取引のコンパクト化につながる可能性があります。 – CAB

関連する問題