2010-09-20 2 views
1

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

ответ

6

Предполагая, что данные поступают из файла, вам лучше сфотографировать этот файл. В противном случае то, что вы делаете, это выделение вашего массива, а затем копирование данных из вашего файла в массив - и поскольку ваш массив сопоставляется с файлом страницы, вы в основном просто копируете исходный файл в файл страницы, и в процессе, загрязняющем «кеш» (т. е. физическую память), поэтому другие данные, которые в настоящее время активны, имеют гораздо больше шансов быть выселенными. Затем, когда вы закончите, вы (обычно) записываете данные обратно из массива в исходный файл, который (в данном случае) означает копирование из файла страницы обратно в исходный файл.

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

+0

Мои данные не поступали из файла, но это лучший ответ, который я получил, и это может быть полезно для других, поэтому я соглашусь с ним. –

0

Если данные находятся в большом файле, ознакомьтесь с использованием mmap, чтобы прочитать его. Современные компьютеры имеют так много оперативной памяти, возможно, недостаточно места для подкачки.

+0

А как же манипулировать им прямо в области mmapped? Будет ли он работать? –

+0

Несомненно, это будет очень быстро, пока область, которую вы касаетесь, удобно помещается в вашу физическую память. При выходе или при необходимости в памяти в другом месте страницы будут записаны обратно в файл, но это будет прозрачно для вас. – twk