2016-06-07 7 views
0

2 개의 큰 텍스트 파일 (현재 17MB이지만 GB 일 수 있습니다)은 크기가 RAM 용량을 초과 할 수 있으므로 RAM에로드하지 않으려 고합니다 .파이썬을 사용하여 2 개의 텍스트 파일을 빠르게 비교하십시오.

지금 내가 쓴 코드는 이것이다 : 나는 beforeFile 성공적으로 (예를 들어, if a_line.rstrip() == b_line.rstrip():가 트리거)

비교 하였다 라인에서 제거하면된다 싶은 것을

def stopIfFileExist(filename): 
    if os.path.isfile(filename): 
     raise Exception("%s already exist" %filename) 

def compareDump(before_filename, after_filename, diff_filename): 
    """ 
    Compare 2 dumps generated via makeDump(output_filename) and generate 
    a file containing the differences 
     -before_filename : (string) filename of the first dump 
     -after_filename : (string) filename of the second dump 
     -diff_filename : (string) filename of the diff 
    """ 

    stopIfFileExist(diff_filename) 

    num_lines = sum(1 for line in open(after_filename)) 
    one_percent = num_lines/float(100) 

    diff = [] 

    start = time.time() 

    with open(after_filename, "r") as afterFile: 
     counter = 0 
     for a_line in afterFile: 
      print "completion : %.9f percents" %(counter/float(one_percent)) 
      counter = counter + 1 
      diff.append(a_line) 
      with open(before_filename, "r") as beforeFile: 
       for b_line in beforeFile: 
        if a_line.rstrip() == b_line.rstrip(): 
         diff.pop() 
         break 

    end = time.time() 
    print "task completed in %s seconds" %(end - start) 

    with open(diff_filename, "a") as diffFile: 
     for line in diff: 
      diffFile.write(line) 

그러나 현재 파일을 읽고 있으므로 어떻게해야하는지 알지 못합니다.

아이디어가 있으십니까?

감사합니다.

+0

다른 GB 파일의 모든 행에 대해 GB 파일을 읽는 중입니다. 그것은 결코 빠르지 않을 것입니다. 보다 효과적인 해결책을 찾으려면 파일의 내용을 생각해보십시오. 아무 것도 없다면 데이터베이스에 대해 생각해보십시오. – pacholik

+0

다시 말하면 다음과 같이 다시 말해 보겠습니다. 2 개의 거대한 파일의 diff를 만드는 가장 빠른 방법입니다. 이미 발견 된 행을 제거 할 수 있다면 다음 반복에는 약간의 시간이 걸릴 것입니다. –

+1

여전히 * O (n²) *입니다. – pacholik

답변

-1

다음 테스트 코드를 사용하여 3 분 동안 2 개의 20 메가 바이트 파일을 비교할 수있었습니다.

매 10,000 라인마다 난수를 넣었습니다. 결과에서 diff'd를 볼 수 있습니다.

import random 
import difflib 
import os 
import time 

start = time.time() 

NUM_LINES = int(10000000/4) 
t1 = 'test1' 
t2 = 'test2' 

if os.path.exists(t1): 
    os.remove(t1) 
if os.path.exists(t2): 
    os.remove(t2) 

with open(t1, 'w+') as f1: 
    for number in range(1, NUM_LINES): 
     if number % 10000 == 0: 
      r = random.randint(1, number) 
     else: 
      r = 1 
     f1.write(str(number * r) + '\n') 
    else: 
     f1.seek(0) 

    with open(t2, 'w+') as f2: 
     for number in range(1, NUM_LINES): 
      if number % 10000 == 0: 
       r = random.randint(1, number) 
      else: 
       r = 1 
      f2.write(str(number * r) + '\n') 
     else: 
      f2.seek(0) 

     t1 = f1.readlines() 
     t2 = f2.readlines() 

for l in difflib.unified_diff(t1, t2, lineterm=''): 
    print(l.strip()) 

print('Execution took: {:.2f} seconds'.format(time.time() - start)) 

으로서, 상당히 길다.

관련 문제