Я профилировал некоторый унаследованный код, унаследованный от cProfile.Я уже внес ряд изменений, которые мне помогли (например, с использованием расширений simplejson's 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 = []
Моя вторая мысль - использовать другую нить, но это заставляет меня хотеть умереть внутри.