2011-01-24 2 views
10

私は自然言語処理の研究に使用している大きな文字列を持っています。これをPythonに格納するのがいい方法です。大きな(〜10 GB)リストをPythonで保存してアクセスする方法は?

私はpickleを使うことができましたが、リスト全体をメモリにロードすることは不可能です(私は信じています)。それは約10GBほどで、それほどメインメモリはありません。現在、私はリストをshelveライブラリに保存しています...シェルフは文字列、 "0"、 "1"、...、 "n"で索引付けされています。

このようなオブジェクトを1つのファイルに保存する方法はありますか?それでも、ランダム(ish)アクセスが可能ですか?

複数のリストに分割することをお勧めします。

ありがとうございます!

答えて

9

データをどのように取得するかによって、SQLite3が最適な方法です。 SQLite3はリレーショナルデータへのランダムアクセスに優れていますが、データがあまりリレーショナルでない場合は、それほど意味をなさない可能性があります。 (あなたの持っているものがすべて「ID」番号であってもあなたの文字列であっても、あなたの文字列を格納するためのSQLite3は素晴らしいかもしれません)

何らかの方法で文字列をグループ化するメカニズム(あなたの文章の中には、オブジェクトや主題を暗黙にしているものがあり、具体的に研究をしたいと思っている場合や、文字列の出典に応じて、正式であれ非公式であれ、それを分割することでデータの「作業セット」を大幅に削減し、潜在的に研究のスループットを向上させることができます。しかし、あなたが真にランダムアクセスを望むなら、大きなパイルが一番良いかもしれません。

これが役に立ちます。

+0

私はデータベースが本当にこの種の仕事にもっと適していると思います。私はそのショットを与えるだろうと思う:D –

+1

ちょうどSQLite3に移植。処理がはるかに高速で、ディスクスペースの約3分の1がシェルフの処理にかかっています。 –

+2

ハ! _and_をもっと小さくする。私はSQLite3が大好きです。 :D – sarnold

3

データベースの使用を検討できます。各ストリングに対して1行の文またはストリング表。

オブジェクトリレーショナルマッパー(例:sqlalchemy)の助けを借りて、オブジェクト指向のデータビューを作成して文字列を繰り返したり、データの大きなサブセットを順番に処理したりすることができます。

さらに、作業するアイテムのセットをより細かく制御するために、各センテンスごとに追加のデータを格納することができます。

+0

sqlalchemyについて聞いたことはありませんが、面白いですね。 –

1

私はuse shelve(bdbバックエンドを使用します)またはSqlite3と言います。
私はSQLite3に行くでしょう、単純なリストのためにCREATE TABLE list(idx int primary key, value text);のようなテーブルで十分です。

関連する問題