Как мгновенно запросить базу данных 64Go - PullRequest
0 голосов
/ 22 июля 2010

Ладно, у меня есть отличная задача для вас.Вот формат моих данных:

ID-1 COL-11 COL-12 ... COL-1P
...
ID-N COL-N1 COL-N2 ... COL-NP

ID - это мой первичный ключ и индекс.Я просто использую идентификатор для запроса моей базы данных.Модель данных очень проста.

Моя проблема заключается в следующем: у меня 64Go + данных, как определено выше, и в приложении реального времени мне нужно запросить базу данных и получить данные мгновенно.Я думал о 2 решениях, но установить их было невозможно.

Сначала используйте sqlite или mysql.Нужна одна таблица с одним индексом по столбцу ID.Проблема в том, что база данных будет слишком большой, чтобы иметь хорошую производительность, особенно для sqlite.

Второе - хранить все в памяти в огромной хеш-таблице.RAM - это предел.

У вас есть другое предложение?Как насчет сериализации всего в файловой системе, а затем, при каждом запросе, сохранять запрошенные данные в кэш-системе?

Когда я говорю в реальном времени, я имею в виду примерно 100-200 запросов / секунду.

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

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

Сначала я попробую использовать настоящую СУБД, встроенную или локальную, и измерить производительность. Если это дает 100-200 запросов в секунду, то все готово.

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

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

0 голосов
/ 22 июля 2010

Учитывая способ использования данных, вы должны сделать следующее:

  1. Создание структуры записи (фиксированного размера), которая достаточно велика, чтобы содержать одну полную строку данных
  2. Экспорт исходных данных в плоский файл, соответствующий формату, определенному на шаге 1, с упорядочением данных по идентификатору (в инкрементах)
  3. Сделайте прямой доступ к файлу и оставьте кеширование для ОС. Чтобы получить номер записи N (на основе 0), вы умножаете N на размер записи (в байтах) и читаете запись непосредственно из этого смещения в файле.

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

...