6

A.txt文字列のリストを含む 2 GBの大きなファイル ( ) があります['Question','Q1','Q2','Q3','Ans1','Format','links',...]

これで、上記の文字列を 2 番目の位置に含む別の大きなファイル (1 TB) ができました。

出力:

a, Question, b
The, quiz, is
This, Q1, Answer
Here, Ans1, is
King1, links, King2
programming,language,drupal,
.....

file に保存されているリストの文字列が 2 番目の位置に含まれている行を保持したいと思いますA.txt。つまり、以下の行を保持(別のファイルに保存)したい:

a, Question, b
This, Q1, Answer
Here, Ans1, is
King1, links, King2

ファイル (A.txt) 内のリストの長さが 100 の場合にこれを行う方法を知っています..「any」を使用します。しかし、ファイル (A.txt) 内のリストの長さが 2 GB の場合、どうすればよいかわかりません。

4

2 に答える 2

8

リストは使用しないでください。代わりにセットを使用してください。

最初のファイルをセットに読み込みます。

with open('A.txt') as file_a:
    words = {line.strip() for line in file_a}

0.5 GB の単語は、セットに保存するにはそれほど多くありません。

wordsこれで、O(1) 定数時間でテストできます。

if second_word in words:
    # ....

2 番目のファイルを開き、行ごとに処理csvします。行の単語がコンマで区切られている場合は、おそらくモジュールを使用します。

より大きな単語セットについては、代わりにデータベースを使用してください。Python には次のsqlite3ライブラリが付属しています。

import sqlite3

conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE words (word UNIQUE)')

with open('A.txt') as file_a, conn:
    cursor = conn.cursor()
    for line in file_a:
        cursor.execute('INSERT OR IGNORE INTO words VALUES (?)', (line.strip(),))

それに対してテストします:

cursor = conn.cursor()
for line in second_file:
    second_word = hand_waving
    cursor.execute('SELECT 1 from words where word=?', (second_word,))
    if cursor.fetchone():
         # ....

ここではデータベースを使用してい:memory:ますが、SQLite は、メモリがいっぱいになり始めたときに一時ファイルにデータを格納するほどスマートです。接続は基本的に一時的な 1 回限りの:memory:データベースです。単語データベースを再利用したい場合は、実際のファイルパスを使用することもできます。

于 2013-05-29T20:30:57.033 に答える
1

Martijn Pietersによる回答から始めます。それが遅すぎる場合は、ブルーム フィルターを使用して、リスト内のどの単語にも一致しない可能性のある行を削除することで、データベースを使用する回数を減らすことができます。Python には、フィルター テーブルへのハッシュの 1 つに使用できる組み込みhash関数が付属しており、他のハッシュをいくつでも検索できます。

于 2013-05-29T23:15:17.777 に答える