Тормоза при работе с большими файлами в Windows7

Есть система, портированная из Linux в Windows, которая прекрасно жила в Linux, а в Windows начали наблюдать необъяснимые явления.

Система использует для хранения данных большой файл, расположенный на файловой системе. Размер файла, для определенности 30Гб. Мы неким образом структурируем этот файл внутри, размещая и считывая данные. Под Linux-ом роль такого файла выполняло блочное устройство, которые мы таким образом на низком уровне использовали безо всякой файловой системы. Под Windows заказчику очень захотелось, чтобы мы создавали именно файл на существующей у него файловой системе NTFS. Тут и начались наши беды…

Сразу скажу, что файлы мы размещаем в местах, в которых Windows7 официально разрешает это делать пользовательским приложениям. На грабли с невозможностью положить файл в корень системного диска мы наступили, вытерли сопли, пофиксили и пошли дальше.

Сначала мы создавали обычный огромный файл и пытались работать с ним разными доступными нам способами: позиционируясь внутри и выполняя обычные операции чтения-записи или альтернативный вариант, используя map нужных нам областей и работу с ними. Столкнулись с тем, что если пытаться работать с только что созданным программой файлом, то операции чтения-записи в него завешиваются на неопределенное продолжительное время, а при использовании mapping-a попытки записи конечно проскакивают (не блокируясь), но при этом страшно растет потребление системной памяти (не нашего процесса!) — видимо винда забивает записываемые нами данные в какой-то свой hdd-кэш.

Ситуацию удалось, как нам казалось, решить созданием «дырявых» файлов. Файлы мы действительно создаем true-дырявые, о чем наглядно говорит виндовая панелька с информацией о файле (размер файла 30Гб, а места на диске занимает несколько килобайт). Все проблемы вроде бы решились, файл быстро создается, и через read-write и через mapping с ним идет работа, никаких блокировок и никакого роста памяти не наблюдается. Вроде бы все хорошо, но обратили внимание на неприятное явление, которое сейчас стало критичным:

1. Если «дырявый» файл только что создан нашей программой, то работа с ним идет очень быстро (и по дебагу и по средствам визуализации, которые строят gui на основе информации, считанной из этого файла).
2. Стоит нам перезапустить программу, которая начинает работать с уже существущим файлом, начинаются необъяснимые протормозки при работе с файлом. Реально скорость выполнения тех же самых операций read замедляется в десятки раз.

Что это может быть? В какую сторону следует копать? Какой black magic кастануть?

Заранее благодарю за ответы.
  • Вопрос задан
  • 4276 просмотров
Пригласить эксперта
Ответы на вопрос 3
WhiteD
@WhiteD
Специалист широкого профиля
Дело в том, что когда вы открываете файл и делаете в него запись данных, а потом читаете — на самом деле вы читаете из кеша. Когда вы открывате файл второй раз — вы читаете эти данные с диска. Отсюда и разница по времени.
Ответ написан
LordMerlin
@LordMerlin
Болван
Наверное вам стоит все таки обратить внимание базы данных.
Ответ написан
@v2v
Немного настораживают описанные проблемы с обычным огромным файлом.
Возможно, тормоза связаны со смешиванием обычного чтения-записи и проекций.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы