Ускорить запись в файлы

Я профилировал некоторый унаследованный код, который унаследовал с помощью 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 = [] 

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

3 Solutions collect form web for “Ускорить запись в файлы”

На самом деле, ваша проблема заключается не в том, что file.write() занимает 20% вашего времени. Это в 80% случаев, когда вы не находитесь в file.write() !

Запись на диск медленная. Вы ничего не можете с этим поделать. Для записи материала на диск требуется очень много времени. Вы почти ничего не можете сделать, чтобы ускорить его.

Вы хотите, чтобы время ввода-вывода являлось самой большой частью программы, так что ваша скорость ограничена скоростью жесткого диска, а не временем обработки. Идеальным для file.write() является 100% использование!

Группировка записей в группы по 500 действительно значительно ускорила запись. Для этого тестового примера строки ввода индивидуально занимали 21.051 секунд в I / O, в то время как запись в партиях 117 заняла 5,685 секунды, чтобы написать такое же количество строк. Партии из 500 заняли всего 0.266 секунды.

Вы можете сделать mmap в python, что может помочь. Но я подозреваю, что вы допустили ошибку при профилировании, потому что 7k * 1500 за 20 секунд составляет около 0,5 Мбайт / с. Проведите тест, в котором вы пишете случайные строки с одинаковой длиной, и вы увидите, что это намного быстрее, чем это.

  • Как я могу удалить повторяющиеся строки из файла?
  • Почему чтение одного байта на 20 раз медленнее, чем чтение 2, 3, 4, ... байтов из файла?
  • Запись списка в файл с помощью Python
  • Python: Когда я должен когда-либо использовать file.read () или file.readlines ()?
  • Итерации через слова файла в Python
  • Как безопасно открывать / закрывать файлы в python 2.4
  • Рекурсивная папка Python
  • Прочитать файл с символами продолжения строки в Python
  • Python - лучший язык программирования в мире.