Я профилировал некоторый унаследованный код, который унаследовал с помощью cProfile. Существовала куча изменений, которые я уже сделал, которые помогли (например, с помощью простых расширений C++).Ускорение записи в файлы
В основном этот скрипт экспортирует данные из одной системы в файл фиксированной ширины ASCII. Каждая строка - это запись, и она имеет много значений. Каждая строка имеет 7158 символов и содержит тонну пробелов. Общее количество записей составляет 1,5 миллиона записей. Каждая строка генерируется по одному за раз и занимает некоторое время (5-10 строк в секунду).
Поскольку каждая строка сгенерирована, она записывается на диск как можно проще. Профилирование показывает, что около 19-20% от общего количества времени проведено в file.write()
. Для тестового примера 1500 строк, которые составляют 20 секунд. Я бы хотел сократить это число.
Теперь кажется, что следующая победа будет уменьшать количество времени, затрачиваемого на запись на диск. Я хотел бы уменьшить его, если это возможно. Я могу хранить кэш записей в памяти, но я не могу дождаться конца и сбросить все это сразу.
fd = open(data_file, 'w')
for c, (recordid, values) in enumerate(generatevalues()):
row = prep_row(recordid, values)
fd.write(row)
if c % 117 == 0:
if limit > 0 and c >= limit:
break
sys.stdout.write('\r%s @ %s' % (str(c + 1).rjust(7), datetime.now()))
sys.stdout.flush()
Моя первая мысль состояла в том, чтобы сохранить кэш записей в списке и записать их в виде партий. Будет ли это быстрее? Что-то вроде:
rows = []
for c, (recordid, values) in enumerate(generatevalues()):
rows.append(prep_row(recordid, values))
if c % 117 == 0:
fd.write('\n'.join(rows))
rows = []
Моей второй мыслью было бы использовать другую тему, но это заставляет меня хотеть умереть внутри.
В чем заключается узкое место приложения? –
Я думал, что я поняла. Он тратит 20% своего времени на запись на одну строку за раз. – chmullig
Что ж, внесите изменения и профайл? Ожидается, что это будет иметь небольшой эффект, поскольку файловый ввод-вывод, как правило, буферизируется ... или так я предполагаю. – delnan