xchgeaxeax писал(а):Для предопределения размеров файла вы по прежнему генерируете медленные операции с диском. А вот дополнительные взаимодействия по выделению рам идут гораздо быстрее таковых.
Я тоже наивно думал, что выделение памяти много времени не занимает, и вначале код «Фазы ноль» был такой.
- Код: Выделить всё
- ///Фаза 0
 //"Форматирование потока"
 
 For I:=0 to CC-1 do
 begin
 //....
 SZ:= getFileSize (CacheFilename);
 
 If SZ<>-1 then
 begin
 ..
 MS1.Size:=MS1.Size+SZ; // (!)
 ..
 end
 end
 end;
 
К моему удивлению тормоз был прямо чудовищный (выедая больше половины общего времени работы всей процедуры   ) ... (понятно что при загрузке данных мемористрим память выделяется иначе но все-же тоже "не бесплатно "  )
В принципе должно работать быстрее, если вы просто будете грузить отдельно каждый файл в каждом потоке просто создавая новый мемористрим и сохраняя его в массив / лист.
Проблема коллизий всеравно сохраняется (раз выделение памяти как выясняется занимает заметное время   то есть вероятность совпадения нескольких выделений,  перекрытия  областей памяти и прочих неприятностей .  )  
К тому же ОС обычно переадресует работу с памятью для загрузки блока данных от медленного устройства в контроллер DMA, 
Загрузка болка данных  с "блочного устройства"  в память  ВСЕГДА происходит через  "контроллер DMA" но что с эти блоком ( при многократной буферизации и кэшировании ) происходит дальше  дело довольно темное .
К тому же тут вопрос в значительной степени не про чтение файла а про реализацию мемористрима. (как известно он хорошо и надежно работает при последовательном чтении загруженных в него данных но совсем остальным как говорится "возможны варианты" );