合并两个大的排序文件

时间:2015-07-17 03:46:50

标签: python multithreading

任务是合并两个大的已排序文件。它们无法融入记忆中。我的想法是分别从第1行和第2行逐行读取行,然后比较它们以决定将哪一行放在目标文件中。

  

文件1:

     

啤酒

     

焦炭

     

红牛

     

文件2:

     

干酪汉堡包

     

三明治

     

玉米面豆卷

输出文件应为:

  

啤酒

     

干酪汉堡包

     

焦炭

     

红牛

     

三明治

     

玉米面豆卷

我已将这个想法实现如下:

def read_non_empty_line(input):
    while True:
        line = input.readline()
        if line == "": #end of the file
            return ""
        if line.isspace() == False:
            return line.strip()

def combine_sorted_files(file1, file2, output):

    read_file1, read_file2 = True, True

    with open(output,'w') as output_file:
        with open(file1,'r') as input_file1:
            with open(file2,'r') as input_file2:
                while True:
                    if read_file1:
                        line1 = read_non_empty_line(input_file1) #read one line, skip empty line
                    if read_file2:
                        line2 = read_non_empty_line(input_file2) #read one line, skip empty line

                    if line1 == "" or line2 == "": #end of the file
                        break

                    read_file1, read_file2 = False, False
                    if line1 < line2:
                        smaller = line1
                        read_file1 = True
                    else:
                        smaller = line2
                        read_file2 = True

                    output_file.write(smaller+"\n\n")

                while line1 != "": # continue on file1 if necessary
                    output_file.write(line1+"\n\n")
                    line1 = read_non_empty_line(input_file1)
                while line2 != "": # continue on file2 if necessary
                    output_file.write(line2+"\n\n")
                    line2 = read_non_empty_line(input_file2)

问题是我的实施很慢。有什么想法加快这个任务吗?

1 个答案:

答案 0 :(得分:0)

由于您说您的文件非常大,您可以删除字符串连接。

而不是:

output_file.write(smaller+"\n\n")

您可以用以下内容替换所有示例:

output_file.write(smaller)
output_file.write("\n\n")

这将阻止python从将smaller"\n\n"添加到一起的结果中创建新字符串,并且会更快。虽然它可能不明显:)

不要忘记字符串在python中是不可变的,并且使用+操作并不是简单地将换行符添加到字符串中。首先,它必须在将新字符串的结果传递给函数之前创建一个完整的新字符串。