Размер динамического массива и ошибка выделения памяти

В рамках решения вопроса Как загрузить очень большой текстовый файл в TStringList? обнаружил следующую интересную вещь:

На компьютере 192 Гб оперативной памяти, системой и виртуальным диском заняты 42 Гб, то есть свободной - условно 150 Гб. Работаю с данными секвенирования генома, фактически - текстовыми файлами. Поскольку данные используются в программе неоднократно (кратность использования от 200 раз и выше), гружу их в память (ANSI, 1 символ = 1 байт) в виде динамического массива строк ANSIString. Столкнулся с тем, что не могу создать массив размером более 95 с копейками гигабайтов. Вылетает с ошибкой: Fatal: Out of memory, причём не важно, расширяю ли я массив в процессе чтения файла или сразу пытаюсь создать его таким большим. Причем я могу создать массив 94 Гб и тут же еще один массив в 32Гб.

Как вы считаете, это особенность материнской платы в реализации доступа к памяти? (На работе рабочая станция на ThreadRipper'е с 256Гб не имеет такой проблемы.)

Есть ли идеи, как это обойти? MemoryMapped файлы использовать как-то не хочется: ставил 192Гб именно потому, что стандартный размер данных в наших исследованиях 102Гб. Когда-то вроде для ещё TurboPascal существовал модуль, поддерживающий "разряженные массивы", есть ли что-то подобное для Delphi? Сейчас обхожусь полубайтовым кодированием, но это во многом - полумера.

P.S. Проверил на DevStudio, та же самая проблема и у детища Microsoft, то есть дело не в менеджере памяти языка.

P.P.S. Да, на ThreadRipper'е не получилось создать массив более 126.89 Гб под Windows 10. Завтра поставлю на эту машину MS Server, посмотрим. Но все равно - более 100 Гб получилось.


Ответы (0 шт):