Проецирование файла на память не более чем удобство для программиста. Для больших файлов никакого прироста в скорости она не даёт. Скорее даже наоборот. Поскольку маленький файл сразу грузится в память, при том в реальную железную и далее будет обрабатываться со скоростью её тайминга. А вот с большим объемом наступает #опа. Большая часть файла скорее всего будет загружена в память виртуальную т.е. на тот же жесткий диск. И на круг получается что чтобы прочитать файл с диска он сначала перезаписывается всё на тот же диск, а уже потом начинает читаться. Я с этим столкнулся при попытке сортировки файла. Самый быстрый (на мой взгляд) способ это выделение буфера в оперативной памяти, достаточно большого объема для уменьшения числа проходов, но достаточно маленький, для того что бы система выделяла под него часть реальной памяти, а не начинала запихивать хвост в виртуальный блок созданный на диске.
1. Используйте асинхронное чтение: пока вы сравниваете большой кусок памяти, другой большой кусок подгружается потоком в фоне с диска. 2. Читайте большими блоками. Для жёсткого диска поиск дорожки и сектора (рандомный доступ) намного дороже линейного чтения. Опыт показывает, что чтение 64М-блоками по времени занимает чуть больше, чем 1М-блоками при условии, что файл не сильно фрагментирован. 3. mmap здесь не нужен.
Недавно наткнулся на файлы, которые собирался сюда добавить, но тогда, в 2017, случились проблемы с организмом и топик оборвался... Ну и решил все-таки выложить, что собирался, - хотя бы из уважения к автору "010 Editor" Graeme Sweet, который в ответ на мой вопрос - написал скрипт "Compare.1sc" ! Кстати, изменения в интерфейсе fcdd, помимо уточнений и упрощений, связаны и с особенностями этого скрипта: Спойлер I've attached a script which should set the error code after the compare. You can copy this script to the '010 Templates' directory and then you should be able to use it like this: 010editor -script:Compare.1sc: (<file1>,<file2>) To quit after running the script use: 010editor -script:Compare.1sc: (<file1>,<file2>) -exit Note that if you pass a file path to <file1> or <file2> you have to use '\\' instead of '\'. For example: 010editor -script:Compare.1sc: (c:\\temp\\profile4.dat,c:\\temp\\profile4.dat) -exit The '\\' is what we were investigating and we may try to remove this requirement in the future. Let us know if you have any trouble getting it to work. Graeme Отсюда и добавленный переключатель "\\" .