Пейджинг по требованию для анализа больших объемов данных - PullRequest
0 голосов
/ 16 сентября 2009

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

Однако из-за того, что вся зарегистрированная информация хранится в памяти, существует ограничение на продолжительность регистрации. В большинстве случаев это нормально, но возможно может работать дольше, даже если это ухудшит производительность.

В идеале программа должна иметь возможность начать использовать пространство на жестком диске в дополнение к ОЗУ, как только использование ОЗУ достигнет определенного предела.

Это приводит к моему вопросу: Существуют ли какие-либо решения для этого? Он должен работать как на Unix, так и на Windows.

Ответы [ 3 ]

0 голосов
/ 16 сентября 2009

Чтобы использовать диск после заполнения памяти, мы используем технологии кэширования , такие как EhCache. Они могут быть настроены с объемом используемой памяти и переполнением на диск.

Но у них также есть более умные алгоритмы, которые вы можете настроить по мере необходимости, например, отправка на диск данных, которые не использовались в последние 10 минут и т. Д. ... Это может быть плюсом для вас.

0 голосов
/ 16 сентября 2009

Это может показаться слишком очевидным, но как насчет файлов с отображенной памятью? Это делает то, что вы хотите, и даже позволяет 32-разрядному приложению использовать намного больше 4 ГБ памяти. Принцип прост: вы выделяете нужную память (на диске), а затем отображаете только часть ее в системную память. Вы можете, например, отобразить что-то вроде 75% доступного объема физической памяти. Затем поработайте над этим, и когда вам понадобится другая часть данных, просто переназначьте карту. Недостатком этого является то, что вы должны делать сопоставление вручную, но это не обязательно плохо. Хорошо, что вы можете использовать больше данных, чем умещается в физической памяти и в пределах памяти для каждого процесса. Он отлично работает, если вы используете только часть данных в любой момент времени.

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

Это работает одинаково на обеих Windows на Unix. Для Windows приведена статья Раймонда Чена , в которой показан простой пример.

0 голосов
/ 16 сентября 2009

Не зная больше о вашем приложении, невозможно дать идеальный ответ. Однако это звучит немного похоже на то, как будто вы заново изобретаете колесо. Рассматривали ли вы использование внутрипроцессной библиотеки баз данных, такой как sqlite ?

Если вы использовали это или подобное, оно позаботится о перемещении данных на диск и в память и с них и предоставит вам мощные возможности SQL-запросов одновременно. Даже если ваши данные журналирования находятся в произвольном формате, если у каждого элемента есть какой-либо ключ или индекс, небольшая легкая база данных может подойти.

...