Сохранение и перезагрузка больших многомерные наборы данных в Python

Я собираюсь запустить большое количество симуляций, производящих большой объем данных, которые необходимо сохранить и получить к ним позже. Выходные данные моей программы моделирования записываются в текстовые файлы (по одному на моделирование). Я планирую написать программу на Python, которая считывает эти текстовые файлы, а затем сохраняет данные в формате, более удобном для последующего анализа. После долгих поисков Я думаю, что страдаю от информационной перегрузки, поэтому задаю этот вопрос Stack Overflow для получения совета. Вот подробности:

Мои данные будут в основном иметь форму многомерного массива, где каждая запись будет выглядеть примерно так:

data[ stringArg1, stringArg2, stringArg3, stringArg4, intArg1 ] = [ floatResult01, floatResult02, ..., floatResult12 ]

Каждый аргумент имеет примерно следующее количество возможных значений:

stringArg1: 50

stringArg2: 20

stringArg3: 6

stringArg4: 24

intArg1: 10,000

Обратите внимание, однако, что набор данных будет разреженным. Например, для данного значения stringArg1 будет заполнено только около 16 значений stringArg2. Кроме того, для данной комбинации (stringArg1, stringArg2) будет заполнено примерно 5000 значений intArg1. 3-й и 4-й строковые аргументы: всегда полностью заполнен.

Итак, с этими числами в моем массиве будет примерно 50 * 16 * 6 * 24 * 5000 = 576 000, 000 списков результатов.

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

  1. реляционная база данных

  2. PyTables

  3. Словарь Python, который использует кортежи в качестве ключей словаря (с использованием pickle для сохранения и перезагрузки)

Есть одна проблема, с которой я столкнулся во всех трех подходах я всегда сохраняю каждую комбинацию кортежей (stringArg1, stringArg2, stringArg3, stringArg4, intArg1) либо как поле в таблице, либо как ключи в словаре Python. С моей (возможно, наивной) точки зрения, похоже, в этом нет необходимости. Если бы все это были целочисленные аргументы, они бы просто формировали адрес каждой записи данных в массиве, и не было бы необходимости хранить все возможные комбинации адресов в отдельном поле. Например, если бы у меня был массив 2x2 = [[100, 200], [300, 400]], вы бы извлекали значения, запрашивая значение в адресном массиве [0] [1]. Вам не нужно хранить все возможные адресные кортежи (0,0) (0,1) (1,0) (1,1) где-то еще. Так что я надеюсь найти способ обойти это.

Я бы хотел иметь возможность определять таблицу в PyTables, где ячейки в этой первой таблице содержат другие таблицы. Например, таблицы верхнего уровня будут иметь два столбца. Записи в первом столбце будут возможными значениями stringArg1. Каждая запись во втором столбце будет таблицей. Эти подтаблицы тогда будут иметь два столбца, первый из которых будет всеми возможными значениями stringArg2, второй - еще одним столбцом подтаблиц ...

Такое решение было бы просто просматривать и запрашивать (особенно если бы я мог использовать ViTables для просмотра данных). Проблема в том, что PyTables, похоже, не поддерживает наличие в ячейках одной таблицы других таблиц. Так что я, кажется, зашел в тупик.

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

] Ладно, вот где я. Будем очень признательны за любые советы. К этому моменту я так много искал, что у меня заболел мозг. Думаю, пора спросить у экспертов.

6
задан Brian Tompsett - 汤莱恩 7 November 2015 в 15:12
поделиться