1) Проверьте размер сектора вашего диска.
2) Убедитесь, что диск дефрагментирован.
3) Считайте данные, которые являются «локальными» для последних операций чтения, которые вы сделали, чтобы улучшить локальность кэша (кэширование выполняется операционная система и многие жесткие диски также имеют встроенный кэш).
4) Непрерывная запись данных.
Для повышения производительности записи кэшируйте блоки данных в памяти, пока не достигнете размера, кратного размеру сектора, а затем инициируйте асинхронную запись на диск. Не перезаписывайте данные, записываемые в данный момент, пока вы не будете уверены, что данные были записаны (т.е. синхронизируйте запись). Здесь может помочь двойная или тройная буферизация.
Для лучшей производительности чтения вы можете удвоить чтение буфера. Итак, допустим, вы кэшируете 16K блоков при чтении. Прочитайте первые 16 КБ с диска в блок 1. Инициируйте асинхронное чтение 2-х 16 КБ в блок 2. Начните работу с блоком 1. Когда вы закончите с блоком 1, синхронизируйте чтение блока 2 и начните асинхронное чтение в блок 1 3-й блок 16 КБ в блок 1. Теперь работайте над блоком 2. Когда закончите синхронизировать чтение 3-го блока 16 КБ, инициируйте асинхронное чтение 4-го блока 16 КБ в блок 2 и работайте над блоком 1. Промойте и повторяйте, пока не обработаете все данные.
Как уже говорилось, чем меньше данных вам нужно прочитать, тем меньше времени будет потеряно при чтении с диска, поэтому, возможно, стоит читать сжатые данные и тратить время ЦП на расширение каждого блока при чтении. Равное сжатие блока перед записью сэкономит вам дисковое время. Будет ли это победа или нет, на самом деле будет зависеть от того, насколько интенсивно процессор обрабатывает данные.
Кроме того, если обработка блоков асимметрична (т. е. обработка блока 1 может занять в 3 раза больше времени, чем обработка блока 2), рассмотрите тройную или более буферизацию для операций чтения.
person
Goz
schedule
25.01.2011