2016-07-06 16 views
0

2次元のpython dictにCSVファイルまたはExcelシート(行と列を含む)からデータをロードする必要があります。 Excelシートのデータは次のようになりますたとえば、:共有メモリを持つ2次元のpython dict

name age gender location 
1 Jim 18 male China 
2 Ross 18 male China 
3 Cara 19 female Japan 
4 Ted 18 male China 

次に出力Pythonの辞書は次のようになります。

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

あなたは内の重複に関する情報がたくさんあることがわかりますこの2次元のdict(そして、実際のデータについては、それは同じ条件を持っている)ので、私は共有メモリを使って新しいdictを開発する考えを思いつきました。具体的には、上記の例では、私の二次元辞書は、{'age': 18, 'gender': 'male', 'location': 'China'}のコピーを複数の行に保存するだけです(これらの行は隣接する必要はありません)。 data[1]['age']data[2]['age']を呼び出す場合、同じ抽出された小さな共有の辞書でルックアップを実行する必要があります。

私はpython dictのソースコードを読んでいます。私はpython dictがキーと値へのポインタを保存していることを知っています(通常は小さなintとstringオブジェクトに対して、異なるオブジェクトは同じオブジェクトを指します)。だから私は1つのコピーを保存したいという意味では、私はポインタのコピーを意味します。

このディクテーションをどのように設計するかについてのご意見はありますか?どうもありがとう!!!

EDIT

申し訳ありませんが、私が言及するのを忘れています。この2Dディクテーションのデータは読み取り専用です。

+3

これは非常に悪い考えのように聞こえます。ジムの場所を変更すると、突然ロスとテッドも変わった。 –

+0

@Kelvin申し訳ありませんが、私は言及するのを忘れました。この辞書のデータは読み取り専用になります:) –

+3

これらの人々の間に本質的な共有コンポーネントがない限り、[圧縮アルゴリズム](https://en.wikipedia.org/wiki/)が必要ですData_compression)。原則として、これはディクショナリ内のアイテムへのアクセスをスピード・トレードオフとスピード・トレードオフの間で遅くすることに注意してください。 –

答えて

1

私はあなたに、メモリサイズと参照の使用の両方を考慮する必要があるデータ圧縮ソリューションについて質問しているようです。最小のメモリー占有量は通常、少なくともメモリー参照と同じくらい小さい整数に属しているため、あまりにも不都合でない限り、すべてを整数にマップしようとします。また、リストはディクショナリよりも小さく、直接の高速インデックス作成が可能です。ここで

はいくつかのアイデアを刺激かもしれない代替実装です:

import sys 

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

In [43]: sys.getsizeof(data) 
Out[43]: 280 # bytes 

data_list = [ 
    ('Jim', 18, 0, 'CH'),  # 'CH' => 'China' 
    ('Ross', 18, 0, 'CH'), # 0 => Female, 1 => Male 
    ('Cara', 19, 1, 'JP'), # 'JP' => 'Japan' 
    ('Ted', 18, 0, 'CH') 
] 


In [44]: sys.getsizeof(data_list) 
Out[44]: 104 # bytes 

_name, _age, _gender, _location = 0, 1, 2, 3 

In [45]: data_list[2][_age] # access as 2D array instead of 2-level dict 
Out[45]: 19 

上記の溶液が少し遅くなることが、大きな文字列のいくつかの利点が得られます。参照を使用すると、各レコードが長くなるまでは、おそらく何も保存されません。最後に、文字列名と国コードの代わりにすべての値を整数に置き換えると、Pythonリストを使用してかなり圧縮されます。

あなたが本当に最良の圧縮を与える数値コードを選択するに取得したい場合は、ハフマン符号化に見て、例えば、このサイト:http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding

関連する問題