У меня есть следующие данные:удалить повторяющиеся строки из файла
number1
I am writing line1 .
number2
First line .
number3
I am writing line2.
number4
Second line .
number5
I am writing line3 .
number6
Third line.
number7
I am writing line2 .
number8
Fourth line .
number9
I am writing line5 .
number10
Fifth line .
Теперь я хочу, чтобы удалить повторяющиеся строки из этого текстового файла - наряду с этим я хочу, чтобы удалить 1 предшествующую и 2 последующие строки по дубликат строки. Такой, что после удаления моих данные выглядят следующим образом:
number1
I am writing line1 .
number2
First line .
number3
I am writing line2.
number4
Second line .
number5
I am writing line3 .
number6
Third line.
number9
I am writing line5 .
number10
Fifth line .
Размер моего файла 60 Гб, и я использую сервер с 64 ГБ оперативной памяти. Я использую следующий код для удаления дубликатов:
fOutput = open('myfile','w')
table_size = 2**16
seen = [False]*table_size
infile = open('test.ttl', 'r')
while True:
inFileLine1=infile.readline()
if not inFileLine1:
break #EOF
inFileLine2=infile.readline()
inFileLine3=infile.readline()
inFileLine4=infile.readline()
h = hash(inFileLine2) % table_size
if seen[h]:
dup = False
with open('test.ttl','r') as f:
for line1 in f:
if inFileLine2 == line1:
dup = True
break
if not dup:
fOutput.write(inFileLine1)
fOutput.write(inFileLine2)
fOutput.write(inFileLine3)
fOutput.write(inFileLine4)
else:
seen[h] = True
fOutput.write(inFileLine1)
fOutput.write(inFileLine2)
fOutput.write(inFileLine3)
fOutput.write(inFileLine4)
fOutput.close()
Однако, оказывается, этот код очень медленный. Есть ли способ, с помощью которого я могу повысить эффективность кода, используя распараллеливание, то есть используя все 24 ядра, доступные мне в моей системе, или используя любую другую технику.
Хотя приведенный выше код написан на Python - но я в порядке с эффективными решениями в C++ или Python или Java или с помощью Linux команд
Здесь test.ttl мой входной файл с размером 60GB
@tmoreau Фактически я ищу эффективную реализацию --- т.е. даже если ответ последовательный (т. Е. Не использует распараллеливание), но эффективен, что является приемлемым для меня –
Разделите свои данные на куски и обработайте каждый кусок параллели , Я не уверен, но bash мне кажется худшим выбором. Я бы попробовал Java или C++. –
Я думаю, что это вопрос с алгоритмами. Здесь вполне можно спросить об этом. Текущий алгоритм O (N^2), и вопросник явно хочет чего-то лучшего. Лучший алгоритм использования, вероятно, зависит от количества повторяющихся строк по отношению к количеству не дублированных строк.Знаете ли вы, сколько будет дубликатов? например 1% строк? 50%? –