2016-09-22 6 views
0

2つの大きなファイルがあります:最初の1つ(10GB)には特定の形式のキーの現金を含むテキストが含まれています{keyX}と2番目(3GB)とその値(45百万エントリ)。ファイル内の対応する金額を別のファイルの対応する値で置き換えます

FILE1:

Lorem ipsum {key1} sit amet, consectetur {key41736928} elit, ... 

FILE2:私は、メモリ内のすべてのキーと値のペアをロードすることはできませんが、私は全体秒で検索することができない第二のファイルの大きさを考慮すると

{key1} dolor 
... 
{key41736928} adipiscing 
... 

すべてのキーの発生のためのファイル。

第1ファイルのすべてのキーを第2ファイルの相対値で置き換えるにはどうすればよいですか?

答えて

0

2番目のファイルでバイナリ検索を使用します。それはキーで注文されるので、あなたができるのはログ(n)検索だけです。

def get_row_by_id(searched_row_id): 
    step = os.path.getsize(mid_name_file)/2. 
    step_dimension = step 
    last_row_id = "" 

    with open(mid_name_file, 'r') as f: 
     while True: 
      f.seek(int(step), 0) # absolute position 
      seek_to(f, '\n') 
      row = parse_row(f.readline()) 
      row_id = row[0] 

      if row_id == last_row_id: 
       raise ValueError(searched_row_id) 
      else: 
       last_row_id = row_id 

      if row_id == searched_row_id: 
       return row[1] 
      elif searched_row_id < row_id: 
       step_dimension /= 2. 
       step = step - step_dimension 
      else: 
       step_dimension /= 2. 
       step = step + step_dimension 


def seek_to(f, c): 
    while f.read(1) != c: 
     f.seek(-2, 1) 


def parse_row(row): 
    return row.split('\t')[0], row 
0

複数の辞書に分割して、それぞれの辞書に対して最初のファイルを処理できます。しかし、いくつの辞書?私は、第1のファイルから1Mbのデータを第2の(例えば)10Mb、100Mb、200Mb、500Mbの様々な量に対して処理する実験を行い、(a)あなたの利用可能なリソースは対処することができません。(b)このファイルのペアの辞書サイズによって時間がどのように異なるか。次に、これが実行可能なアプローチであるかどうかを判断し、そうであれば、使用するサイズの割り振りを決定します。

関連する問題