2009-05-21 15 views
2

私は、ユーザーが会社と日付のペアのリストを提出し、その日付にニュースイベントがあるかどうかを調べることができるアプリケーションを構築しています。ニュースイベントは、会社識別子と日付をキーとして辞書に格納されます。辞書を読み込むよりもディスクからリストを読む方が良いのですか?

newsDict('identifier','MM/DD/YYYY')=[list of news events for that date] 

辞書は、私は思った、あまりにもよりもさらにメモリでそれを構築する大きなので、私はそれぞれの作品は、会社識別子の特定の範囲に制限され、3枚にそれを壊したはるかに大きいことが判明しました。

私の計画は、ユーザーが提出したリストを利用して、会社のイベントが見つかると予想される特定のnewsDictと一致するように、会社識別子のユーザーリストを辞書グループを使用して取得し、値。

リストの各項目は、タプルのサブリストのリストであることで、リスト内のニュースイベントを維持するほうがよいのではないでしょうし、別のリスト

[('identifier','MM/DD/YYYY'),[list of news events for that date]] 

私の考えは、その後であればよく、今私は疑問に思って私はそれぞれの会社の識別子のためのリストの範囲を持つことになり、辞書を持っているだろうと

companyDict['identifier']=(begofRangeinListforComp,endofRangeinListforComp) 

私は、私は必要な範囲をルックアップするために、ユーザの入力を使用して、並べ替え識別子と範囲のリストを構築します範囲。次に、リストの適切なセクションを読んでデータを取得し、出力を構成します。私はこれを参照

最大の理由であっても三分のに分け辞書で各セクションが私のマシンにロードするために約2分かかり、辞書はラムの約600〜750メガバイトを取って終わるということです。

私は、800万行のリストをロードするためにのみ約15秒かかりましたし、約1/3 1/3のエントリを持っていた辞書のメモリの使用ことに注意して驚きました。また

、私はユーザリストを下に働くように、私はメモリを解放するリストを介して動作として、私は、リストの行を破棄することができるからです。

私は辞書がこれを行うための最も効率的な方法だろうと思ったように私は驚いています。しかし、私のことは、辞書はリストよりもかなり多くのメモリを必要とすることを示唆しています。私と他の場所での他の投稿の私の読書は、他の構造がリストポインタよりも高価なポインタ割り当てを必要とすることを示唆しています。私はここに何かを見逃していますか?これを行うにはよりよい方法がありますか?

私のコメントにアルベルトの答えと応答を読んだ後、私は、DBを使用した場合に関数を記述する方法を理解しようとしているいくつかの時間を費やしました。私はこの中をラップする必要が

outList=[] 
massiveFile=open('theFile','r') 
for identifier in sortedUserList 
# I get the list and sort it by the key of the dictionary 
    identifierList=massiveFile[theDict[identifier]['beginPosit']:theDict[identifier]['endPosit']+1] 
    for item in identifierList: 
     if item.startswith(manipulation of the identifier) 
     outList.append(item) 

:今、私は、DBプログラミングについて多くを知らないので、私はここに足かせかもしれないが

私は、DBを使用して実装するコードは、はるかに複雑よりもだと思いますリストをdbに変換すると、私はそれほど単純ではない何かを見たことがありませんでした。

もちろん、このフォーラムに私を連れて来る理由は簡単ではありませんでした。私はまだ別の構造体を使うことでメモリが少なくて済むことは分かりません。私には30000の会社識別子と約3600の日付があります。私のリストの各項目はOODの意味でのオブジェクトです。それが私が苦労しているところです。私は今日の朝6時間を費やして、私が諦める前に辞書のデータを整理しました。データベースを実装する時間を費やして、それをロードするために他の人のメモリの半分以上を使用していることがわかりました。

答えて

5

このような大量のデータでは、データベースを使用する必要があります。これはリストを見るよりはるかに良くなり、とにかくデータを格納する最も適切な方法になります。 Pythonを使用している場合は、SQLiteが組み込まれています。

+0

データベースを使用する利点は何ですか? – PyNEwbie

+0

基本的に、コーディングする機能はすべて、異なるSQL呼び出しを行うことですでに存在しているので、データベース内のテーブルに基づいて、必要な種類のリストをすべて作成することができます。データベースには、RAMに格納されているデータも格納されません。これは大きなプラスです。 – AlbertoPL

+0

SqliteはPythonの標準モジュールです。私はElixir(SQLAlchemy)とテーブル/クエリマネージャをお勧めします。 – monkut

1

辞書は実質的にハッシュであるため、より多くのメモリを消費します。

ルックアップの要件が非常に単純であるため、データベースを使用することは必要ありません。ファイルシステムを使用するだけです。

企業名(またはティッカー)に基づいてディレクトリ構造を作成し、各日付のサブディレクトリを作成します。データが存在するかどうかを調べ、データをロードするには、データが存在するサブディレクトリの名前を作成し、それが存在するかどうかを確認します。

たとえば、実際にその日のニュースがあった場合、5月21日のIBMのニュースはC:\ db \ IBM \ 20090521 \ news.txtになります。ファイルが存在するかどうかをチェックするだけです。検索はありません。

速度を上げようとしている場合は、頻繁に要求される可能性のある限られた量の結果をキャッシュするスキームを用意してください(サーバーを操作していると仮定します)。そのためには、ハッシュを使用します。

+0

私は複雑なディレクトリ構造を追加したくはありませんが、300Kの識別子はディレクトリ構造を歩くのが非常に難しくなります。 – PyNEwbie

+0

確かに、1つのディレクトリに何千もの人がいないようにしてください。したがって、C:\ db \ I \ B \ M \ 2009 \ 05 \ 21 \ news.txtを細分して作成します。 –

+0

これは本当にsqliteを使うより簡単ですか? –

関連する問題