1

Python を介して 2 つ以上のパラメーターを指定して、大規模なデータセット (9M 行、1.4 GB) 内の特定の行を取得できるようにしたいと考えています。

たとえば、このデータセットから:

ID1 2   10  2   2   1   2   2   2   2   2   1

ID2 10  12  2   2   2   2   2   2   2   1   2

ID3 2   22  0   1   0   0   0   0   0   1   2

ID4 14  45  0   0   0   0   1   0   0   1   1

ID5 2   8   1   1   1   1   1   1   1   1   2

パラメータの例を考えると:

  • 2 番目の列は 2 に等しくなければならず、
  • 3 列目は 4 から 15 の範囲内でなければなりません

私は取得する必要があります:

ID1 2   10  2   2   1   2   2   2   2   2   1

ID5 2   8   1   1   1   1   1   1   1   1   2

問題は、Python で 2 次元配列に対してこれらの操作を効率的に行う方法がわからないことです。

これは私が試したものです:

line_list = []

# Loading of the whole file in memory
for line in file:
    line_list.append(line)

# set conditions
i = 2
start_range = 4
end_range = 15

# Iteration through the loaded list and split for each column
for index in data_list:
    data = index.strip().split()
    # now test if the current line matches with conditions
    if(data[1] == i and data[2] >= start_range and data[2] <= end_range):
        print str(data)

データファイルがメモリにロードされていても、このプロセスを何度も実行したいのですが、私がやっている方法は本当に遅いです。

numpy 配列の使用を考えていましたが、特定の条件で行を取得する方法がわかりません。

ご協力いただきありがとうございます !

アップデート :

提案どおり、リレーショナル データベース システムを使用しました。私が Sqlite3 を選んだのは、非常に使いやすく、デプロイが迅速だからです。

私のファイルは、約 4 分で sqlite3 のインポート機能を介して読み込まれました。

情報を取得するプロセスを高速化するために、2 列目と 3 列目にインデックスを作成しました。

クエリは、モジュール「sqlite3」を使用して Python で実行されました。

つまり、はるかに高速です。

4

1 に答える 1

1

私はあなたが持っているほとんどのものに行きます(未テスト):

with open('somefile') as fin:
    rows = (line.split() for line in fin)
    take = (row for row in rows if int(row[1] == 2) and 4 <= int(row[2]) <= 15)
    # data = list(take)
    for row in take:
        pass # do something
于 2013-02-01T01:08:14.363 に答える