Ускорение записи в файлы

Я профилировал некоторый унаследованный код с помощью cProfile. Я уже внес ряд изменений, которые помогли (например, использование расширений C simplejson!).

В основном этот сценарий экспортирует данные из одной системы в файл фиксированной ширины 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 = []

Второй моей мыслью было бы использовать другой поток, но от этого мне захотелось умереть внутри.

21
задан chmullig 10 February 2011 в 19:47
поделиться