Ternick
@Ternick

Как работать с массивом быстрее?

Доброго времени суток)

Задача предельно проста, есть 1 большой файл в котором записаны данные, разделённые знаком '|', нужно убрать строки в которых повторяются данные.

Как пример, входной файл:

CLICK

alter|15|25|46
...
alter|19|1|28



На выходе должно получится что-то такое:

CLICK

alter|15|25|46


Мой вариант решения данной задачи:
CODE
domens = []
unically_data = []

def main():
	with open("testdatabase.txt") as f:
		data = list(map(lambda x: x.split("|"), f.read().strip().split("\n")))

	for item in data:
		if item[0] not in domens:
			domens.append(item[0])
			unically_data.append(item)


	with open("_out.txt", "w") as f:
		f.write("\n".join(["|".join(i) for i in unically_data]))

if __name__ == '__main__':
	main()


Проблема в том, что в первоначальном файле очень много строк, около 2х миллионов. Даже если использовать библиотеку threading, особо ничего не меняется. Возможно ли как-то ускорить эту задачу ?
  • Вопрос задан
  • 220 просмотров
Решения вопроса 2
касаемо вашего кода:
это, я думаю, лучше сразу в цикле собирать для каждого item, а то Вы запускаете доп цикл для доп. обработки
"\n".join(["|".join(i) for i in unically_data])

threading нужно ещё правильно использовать чтобы ускорить работу)
попробуйте использовать библиотеку numpy и выполнять преобразования с помощью её функций, она под это заточена

если думать про алгоритм, то для меня он такой (судя по коду и примерам):
1. найти строки, где item[0] встречается впервые
2. собрать из них результирующий массив данных
Ответ написан
@bacon
1. domens сделать set
2. выбросить data и unically_data и сразу писать во второй файл
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
HemulGM
@HemulGM
Delphi Developer, сис. админ
Даже если использовать библиотеку threading, особо ничего не меняется. Возможно ли как-то ускорить эту задачу ?


Просто запихнув цикл в "поток" работу не ускорит, а даже замедлит. Тебе нужно разделить обработку файла.
Например, на 4 части. 1 поток обрабатывает 1 часть строк файла, 2 поток 2 ую часть файла и т.д.

Только питон и потоки в принципе - так себе комбинация
Ответ написан
adugin
@adugin Куратор тега Python
Выполняется менее чем за секунду:
import pandas as pd

pd.read_csv('input.txt', sep='|', header=None).drop_duplicates(0).to_csv('output.txt', sep='|', header=False, index=False)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы