LINUX.ORG.RU

mmap() 10 Gb файл в память для чтения, если памяти всего 2 Gb ?


0

1

Сижу пишу логику чтения несколько-гигового бинарного файла поблочно. Поблочно, дабы обращаться к ФС пореже, остальное время выцеплять бинарные структуры из потока.

Потом думаю - есть же mmap всякий. Мне ведь ничего не мешает замапить весь 10-гиговый файл в память, даже если оперативы всего 2 гига, и прочитать его линейно шагая указателем все 10 гигов? Или что-то мешает? Я себе так это представляю: ОС выделяет некую виртуальную последовательность адресов любой длины (виртуальная же), зачитывает только актуальный кусок файла, вытесняя из кеша неиспользуемое. Или с 2 свободными гигами спокойно замапить 10 гигов для чтения не получится?

Если систем, скажем, 32х битная, то виртуального адресного пространства не хватит для того, чтобы адресовать 10 гигов. В то же время не ясно, что тебе мешает по очереди отображать 2ГБ?

tff ()
Ответ на: комментарий от tff

Если систем, скажем, 32х битная, то виртуального адресного пространства не хватит для того, чтобы адресовать 10 гигов.

С другой стороны, если система 64-хбитная, то можно замапить, не особо оглядываясь на длину реальной памяти. Ибо файл мапится не в оперативку (как бы это могло быть?), а в адресное пространство.

const86 ★★★★★ ()
Ответ на: комментарий от const86

Всё так. Должно быть это всё моя нелюбовь к платформозависимому коду.

tff ()

Вин/досовой гляделке файлов hiew хватало «640К», чтобы отображать файлы любой длины, которые только помещались в тогдашних ФС.

blexey ★★★★★ ()
Последнее исправление: blexey (всего исправлений: 1)

Работает. Я так с 4..8-гиговыми файлами делал.

Eddy_Em ☆☆☆☆☆ ()

Ну, естественно речь про 64 бита. 32-битные тетрисы уже только в музеях (problem? :)

kiverattes ★☆ ()

тебе может тупо нехватить памяти или адресного пространства на таблицы MMU. Они тоже занимают нехило места. Huge Pages тут иногда помогают но не факт.

cvv ★★★★★ ()

Сижу пишу логику

Херовая логика, бро.

Мне ведь ничего не мешает замапить весь 10-гиговый файл в память

Ну так попробовал бы, чё. И заодно проверил что он тебе вернёт.

anonymous ()
Ответ на: комментарий от kiverattes

если запись write-through в файл, то тоже можно

иначе, изменив на 2GB страниц по 1 байту всю оперативку забьешь невыгружаемыми страницами

MyTrooName ★★★★★ ()
Ответ на: комментарий от MyTrooName

невыгружаемыми страницами

Выгружаемыми.

если есть резиновый swap, смысл изначального вопроса как-то пропадает

Во-первых, вопрос был про чтение. Во-вторых, нужен не «резиновый swap» а такой куда влезут модифицированные страницы не поместившиеся в память.

slovazap ★★★★★ ()
Ответ на: комментарий от MyTrooName

А почему невыгружаемыми, оно же в файл может записаться?

kiverattes ★☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.