| 87 | |
| 88 | |
| 89 | class FileMerger: |
| 90 | def __init__(self, merge_strategy): |
| 91 | self.merge_strategy = merge_strategy |
| 92 | |
| 93 | def merge(self, filenames, outfilename, buffer_size): |
| 94 | buffers = FilesArray(self.get_file_handles(filenames, buffer_size)) |
| 95 | with open(outfilename, "w", buffer_size) as outfile: |
| 96 | while buffers.refresh(): |
| 97 | min_index = self.merge_strategy.select(buffers.get_dict()) |
| 98 | outfile.write(buffers.unshift(min_index)) |
| 99 | |
| 100 | def get_file_handles(self, filenames, buffer_size): |
| 101 | files = {} |
| 102 | |
| 103 | for i in range(len(filenames)): |
| 104 | files[i] = open(filenames[i], "r", buffer_size) # noqa: UP015 |
| 105 | |
| 106 | return files |
| 107 | |
| 108 | |
| 109 | class ExternalSort: |