Другой подход (который стоит опубликовать в качестве отдельного ответа): вместо подхода с разделенным файлом, который создает временные файлы, выполните пакетирование в самом программном обеспечении uniqifier. Например, использование реализации Ruby uniqifier для объяснительных целей:
require 'set'
line_batch_count = 50000 # tunable parameter
lines_seen = Set.new
line_number = 0
ARGF.each do |line|
line_number += 1
if (line_number % line_batch_count) == 0
lines_seen.clear
end
unless lines_seen.include? line
puts line
lines_seen << line
end
end
Идея состоит в том, чтобы время от времени очищать хэш-множество. Затем это становится итеративным:
$ cat uniqm-input.txt | ruby uniqm-capped.rb | wc -l
20021
$ cat uniqm-input.txt | ruby uniqm-capped.rb | ruby uniqm-capped.rb | wc -l
1001
$ cat uniqm-input.txt | ruby uniqm-capped.rb | ruby uniqm-capped.rb | head
1506
1054
1623
1002
1173
1400
1226
1340
1824
1091
Таким образом, вы можете запускать эту версию с ограниченными ограничениями неоднократно, пока количество строк не изменится от одной итерации к другой.
Обратите внимание, что этот метод capped-uniqm не зависит от языка: вы можете очистить массив lines_seen
каждые N строк, независимо от того, используете ли вы awk, python, perl, C++ и т. Д. Для всех этих языков существуют методы set-clear; Я считаю, что awk
delete
нестандартно, но распространено.