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" но что с эти блоком ( при многократной буферизации и кэшировании ) происходит дальше дело довольно темное .
К тому же тут вопрос в значительной степени не про чтение файла а про реализацию мемористрима. (как известно он хорошо и надежно работает при последовательном чтении загруженных в него данных но совсем остальным как говорится "возможны варианты" );