2016-07-12 21 views
0

私はこれが非常にばかげた質問だと感じますが、私はもう問題について考えることができません。Pythonで非常に大きなcsvファイルのインデックスを作成

IがID順に並べたCSV形式のデータの非常に大量(60 + GB)を有する:

id, "{data}" 
id2, "{data}" 
... 

I辞書形式でこのデータと組み合わせることが必要なデータの別のセットを(有します現在、いくつかのピクルスファイルに分割されています)。

{player_id: {rating, [ids]}, player_id2: {rating, [ids]}, ... } 

ここで、csvデータのIDは上記のリストのIDに対応しています。私は各IDの詳細をcsvデータからこのデータに入れたいと思っています。つまり、IDを取得し、csvデータでそれを探し、それをこの辞書形式に書き込む必要があります。したがって、ここでの大きなボトルネックは、IDでcsvファイルのデータを検索し、ディスクから読み込みます。

私の現在の解決策は、csvデータを多数の小さなファイル(1〜2MB)に分割し、どのファイルにどのIDが含まれているかを索引付けすることで、データの検索はcsvデータ全体を解析するよりもはるかに簡単です。それでもまだ一定ではなく、すべてのステップでcsvファイルを開く必要があります。

これを行うより速い方法がありますか?私は、私が非常にばかげているように感じ、より速い方法があります。私のソリューションであるマルチプロセッシングは、まだ2週間の領域で終了する予定です。

私の質問が不明な場合は明確にしてください。ありがとう。そのはまだ...あなたは...データベースを使用して考えなければならない痛々しいほど遅いことになるだろうか、非常に少なくとも

+1

ここでは、60GBのデータにCSVを使用するのは良い考えではありません。それを[NoSQL](https://en.wikipedia.org/wiki/NoSQL)データベースに移動することは可能ですか? – Tim

+0

は常に逐次IDですか? (1,2、...、N)?あなたはちょうど1つを見つけようとしています(ID X?) –

+0

pandas pandas.pydata.org –

答えて

0
def get_row(id): 
    with open("fname.csv") as f: 
     row = next(itertools.islice(f,id-1,id),None) 
    return row 

固定幅のエントリなどのデータを保存する(つまり、常に行あたり37バイト)、あなたの場合固定幅のエントリを格納すると、オフセットを計算することができます。offset = id*37;f.seek(offset);return f.read(37)〜ほぼ一定の時間にする必要があります。

+0

速いアクセス時間を持つpython apiを持つ特定のタイプのデータベースはありますか?最大のボトルネックは間違いなく一定のルックアップがあってもI/Oです。 – ddnm

+0

インデックス付きのフィールドに対してクエリを実行していると仮定すると、一定の検索時間に近くなければなりません。アクセス時間...かなり多くのSQLで... nosqlに精通していませんが、nosqlは検索のために –

関連する問題