2015-05-02 4 views
2

Я храню большие векторы (1,4 миллиона значений) удвоений в таблице PostgreSQL. Заявление о создании этой таблицы следует.Улучшение производительности запросов массива PostgreSQL

CREATE TABLE analysis.expression 
(
    celfile_name character varying NOT NULL, 
    core double precision[], 
    extended double precision[], 
    "full" double precision[], 
    probeset double precision[], 
    CONSTRAINT expression_pkey PRIMARY KEY (celfile_name) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE analysis.expression ALTER COLUMN core SET STORAGE EXTERNAL; 
ALTER TABLE analysis.expression ALTER COLUMN extended SET STORAGE EXTERNAL; 
ALTER TABLE analysis.expression ALTER COLUMN "full" SET STORAGE EXTERNAL; 
ALTER TABLE analysis.expression ALTER COLUMN probeset SET STORAGE EXTERNAL; 

Каждая запись в этой таблице записывается только один раз и, возможно, много раз читается случайными индексами. PostgreSQL doesn't seem to scale terribly well for lookups as the vector length grows even with STORAGE set to EXTERNAL (O(n)). Это приводит к следующим запросам: мы выбрали много отдельных значений в массиве, очень, очень медленно (минуты - часы).

SELECT probeset[2], probeset[15], probeset[102], probeset[1007], probeset[10033], probeset[200101], probeset[1004000] FROM expression LIMIT 1000; 

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

Есть ли способ сделать такие запросы быстрее?

редактирует

  • Я использую PostgreSQL 9.3.
  • Все запросы я бегу простые ВЫБИРАЕТ возможно

    SELECT probeset[2], probeset[15], probeset[102], probeset[1007], probeset[10033], probeset[200101], probeset[1004000] FROM expression JOIN samples s USING (celfile_name) WHERE s.study = 'x'; 
    

    В одном сценарии результаты этих запросов будут кормить через модели прогнозирования. Вероятность прогноза сохраняется в БД в другой таблице. В других случаях элементы выбора вытягиваются из массивов для последующего анализа.

  • В настоящее время 1,4 млн. Является самым длинным одиночным массивом, остальные короче, с самым маленьким существом - 22 тыс., А среднее - ~ 100 тыс. Единиц.

  • В идеале я бы сохранил данные массива в виде широкой таблицы, но с 1,4 миллионами записей это невозможно, а длинные таблицы (т.е. строки с celfile_name, index, value) намного медленнее, чем массивы PostgreSQL, если мы хотим вытащить полный массив из данных из БД. Мы делаем это, чтобы загрузить наши нисходящие хранилища данных, когда мы анализируем полный набор данных.
+4

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

+0

Вы на самом деле не ** сохраняете свои большие массивы в PostgreSQL, вы только сохраняете ссылки на внешнее хранилище. Если вы не используете данные из массивов в запросах, которые объединяют их с данными из других отношений, использование PostgreSQL будет неэффективным. Как вы используете данные в PostgreSQL? Можете ли вы рассказать о том, что представляют данные в массивах (например, временные ряды?) И взаимосвязь между четырьмя массивами (f.i. - это данные с одним и тем же индексом в каждом связанном массиве?)? Все четыре массива 1.4M значения длинны или являются совокупным размером? – Patrick

+1

Это должно быть очевидно для вопроса производительности, чтобы предоставить версию Postgres в использовании. Не нужно сначала спрашивать. –

ответ

1

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

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

Если ваши модели прогнозирования написаны на каком-либо языке, для которого доступен драйвер PostgreSQL, сохраните данные в некотором формате, подходящем для этого языка, сделайте ваши прогнозы и запишите результаты в таблицу в PostgreSQL.Это будет работать для таких языков, как C и C++, с библиотекой pq и для Java, C#, Python и т. Д., Используя библиотеку высокого уровня, такую ​​как JDBC.

Если ваша модель прогнозирования написана в MatLab, тогда сохраните свои массивы в формате MatLab и подключитесь к PostgreSQL для получения результатов. Если написано в R, вы можете использовать расширение R для PostgreSQL.

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

+0

Это более или менее то, что мы делаем в нашем текущем решении. Мы используем postgreSQL для хранения нашей метаинформации, и у нас есть два нисходящих хранилища данных для этих больших массивов данных выражения. Один магазин представляет собой обычное двузначное значение ключа в памяти, хранилище данных, которое быстро подходит для запросов с 1 - 1000 индексами массива. Другой магазин - это большие двоичные файлы, которые по существу представляют собой память, отображаемую как большая 2D-матрица стиля С, которая масштабируется лучше, если нам нужно загрузить большое количество индексов для анализа. В идеале мы могли бы использовать доступ к массиву PostgreSQL для замены хранилища значений пользовательского 2D-ключа. – Nixuz

 Смежные вопросы

  • Нет связанных вопросов^_^