2010-11-20 4 views
1

私は非常に大きな辞書を作成したいので、私は自分の記憶を抹消しないようにディスクに保存したいと思います。基本的には、私のニーズは、Pythonが辞書のように扱うクラスですが、ディスク上に生きているという点で、cPickleとdictクラスのクロスです。ディスクに保存されている辞書ファイルを作成するクラスが必要です

私の最初の考えは、単純なMySQLテーブルの周りに何らかのラッパーを作成することでしたが、MySQLがボックスからサポートすることもできない構造体のエントリに型を格納する必要があります。

+0

「大きい」のサイズはどれくらいですか?主に辞書から読んだり、書くのですか?また、MySQLテーブルにデータを格納する方法もあるかもしれませんが、データの詳細については議論するのが難しいです。データは純粋に数値ですか?そうでなければ、何? – unutbu

+0

ファイルが急速に成長するわけではありませんが、サイズには限界がありませんので、可能な限り効率的に時間の経過とともに任意に大きくなるファイルを格納できるソリューションを探したいと思います。 – Alex

答えて

2

最も簡単な方法は、ほぼ正確辞書のように動作shelveモジュールである:可変値(リスト、dicts、等)を変更約module documentationに警告が棚に格納され

import shelve 
myshelf = shelve.open("filename") # Might turn into filename.db 
myshelf["A"] = "First letter of alphabet" 
print myshelf["A"] 
# ... 
myshelf.close() # You should do this explicitly when you're finished 

注(あなたはできますが、もう少し手間がかかります)。これは(c)pickleとdbmをフードの下で使用するので、あなたがピクルできるものを明るく保存します。

私はそれが他のソリューションと比較してどの程度パフォーマンスが良いのか分かりませんが、カスタムコードやサードパーティのライブラリは必要ありません。

1

具体的には、dbmを参照してください。一般的には、マニュアルのData Persistenceの章全体を参照してください。ほとんどのキーストア/バリューストアデータベース(gdbm、bdb、metakitなど)にはdict-like APIがあり、これはおそらくあなたのニーズに対応します(埋め込み可能なので、外部データベースプロセスを管理する必要はありません)。

0

ファイルIOはCPUサイクルの点で高価です。だから私の最初の考えはデータベースに賛成するだろう。

しかし、「英語辞書」を複数のファイルに分割して、各ファイルにアルファベットの特定の文字で始まる単語が含まれるようにすることもできます(したがって、26個のファイルがあります)。

I want to create a very very large dictionaryと言うときは、dict(単語をキーとして使用し、値を定義して)dictに保存されている単語とその定義を持つ英語辞書を意味しますか?あなたが指摘したように、2番目はcPickleで簡単に実装できます。

また、メモリが主な関心事である場合は、使用するファイルの数を再確認する必要があります。dictを各ファイルに保存する場合、dictは不要です(私はすべての英語の単語がソートされていると仮定するつもりです)おそらく、あなたのために使用可能なソリューションは、これを行うことであろう大きすぎる

を得る:

  1. 一つのファイルに英語の言語のすべての単語を取得。
  2. このような単語がいくつあるかを数え、ファイルのサイズに応じて、表示する数のファイルに分割します。
  3. さて、これらの小さいファイルは言葉とその意味

が含まれているこれは、このソリューションが有用であるかである:

は、あなたの問題は、特定の単語の定義を検索することであると言います。実行時に、各ファイルの最初の単語を読み込み、探している単語が前のファイルにあるかどうかを判断できます(最後のファイルであるかどうかを確認するにはループカウンタが必要です) 。探している単語がどのファイルにあるかを判断したら、そのファイルを開き、そのファイルの内容をdictにロードすることができます。

問題の詳細がわからなくても解決策を提示するのは少し難しいです。

+0

私はPythonの辞書を意味します。 – Alex

関連する問題