2016-09-22 82 views
0

我有兩個大文件:第一個(10GB)包含文本,密鑰的發行版以特定格式{keyX},第二個(3GB)包含密鑰之間的映射和他們的價值(四千五百萬條目)。在另一個文件中用一個文件替換密鑰的發行號

文件1:

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

文件2:

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

考慮到我無法加載所有內存中的鍵值對,但我不能在整個第二搜索第二個文件的尺寸文件爲每個鍵的發生。

如何將第一個文件中的所有鍵與第二個文件中的相對值用相當長的時間替換?

回答

0

在第二個文件中使用二進制搜索。它是按鍵排序的,所以你可以做的最好的是log(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

您可以將第二個文件拆分爲多個字典並根據這些字典處理第一個文件。但有多少個字典?我會說,進行一個實驗,從第一個文件中處理(比如說)1Mb的數據與第二個(比如說)10Mb,100Mb,200Mb,500Mb中的不同數量進行處理,以確定(a)是否存在一個級別,可用資源無法應付,以及(b)這對文件的時間與字典大小之間的差異。然後對這是一種可行的方法做出判斷,如果是的話,則對這種分配的大小進行判斷。

相關問題