Хранить огромное количество данных в памяти - PullRequest
2 голосов
/ 30 сентября 2011

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

спасибо Мадс

Ответы [ 7 ]

6 голосов
/ 30 сентября 2011

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

5 голосов
/ 30 сентября 2011

Если вы используете POSIX-совместимую систему, взгляните на mmap .

Я думаю, что в Windows есть еще одна функция для сопоставления памяти файла.

3 голосов
/ 30 сентября 2011

Вы должны изучить технику, которая называется Файл с отображенной памятью .

3 голосов
/ 30 сентября 2011

Вы, вероятно, могли бы решить эту проблему, используя разделяемую память , чтобы иметь один процесс, который долгоживет, построить дерево и выставить для него адрес, а затем другие процессы, которые запускаются, могут получить тот жепамять для запросов.Обратите внимание, что в этом случае вам нужно убедиться, что дерево может быть прочитано несколькими одновременными процессами.Если чтение действительно просто чтение, то это должно быть достаточно просто.

1 голос
/ 02 октября 2011

Я думаю, что лучшее решение - это настроить сервер кеша и поместить туда данные.

Просмотр Ehcache :

Ehcache - это основанный на стандартах кэш с открытым исходным кодом, используемый для повышения производительность, разгрузить базу данных и упростить масштабируемость. Эхаке это надежный, проверенный и полнофункциональный, и это сделало его наиболее широко используемый кэш на основе Java.

Он написан на Java, но должен поддерживать любой язык, который вы выберете :

Сервер кэширования имеет два API-интерфейса: ресурс, ориентированный на RESTful, и SOAP. Оба поддерживают клиентов на любом языке программирования.

0 голосов
/ 30 сентября 2011

В качестве альтернативы вы можете реализовать загрузчик данных как исполняемую программу, а основную программу как dll, загружаемую и выгружаемую по требованию.Таким образом, вы можете хранить данные в памяти и изменять код обработки без перезагрузки всех данных или совместного использования памяти между процессами.

Кроме того, если вы можете работать с необработанными данными издиск, на котором не выполняется какая-либо предварительная обработка (например, помещает его в дерево, манипулирует указателями на его внутренностях), может потребоваться отобразить данные в памяти и избежать загрузки неиспользуемых частей.

0 голосов
/ 30 сентября 2011

Вы должны использовать 64-битную систему, чтобы использовать более 4 ГБ памяти. Если вы построите дерево и установите его как глобальную переменную, вы можете получить доступ к дереву и данным из любой функции в программе. Я предлагаю вам, возможно, попробовать альтернативный метод, который требует меньшего потребления памяти. Если вы опубликуете, какой тип программы и какое дерево вы используете, я, возможно, смогу помочь вам найти альтернативный метод.

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

Также обратите внимание, что в системах Windows вы можете получить доступ к памяти другой программы с помощью ReadProcessMemory (), все, что вам нужно, это указатель, который будет использоваться для определения местоположения памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...