Вопрос в двух словах
Какой лучший способ заставить Python и Java хорошо играть друг с другом?
Более подробное объяснение
У меня несколько сложная ситуация. Я сделаю все возможное, чтобы объяснить как в картинках и словах. Вот текущая архитектура системы:
У нас есть агентное моделирование, написанное на Java. Он имеет возможность либо локальной записи в файлы CSV, либо удаленно через соединение с сервером Java в файл HDF5. Каждый прогон симуляции выплевывает гигабайт данных, и мы запускаем симуляцию десятки раз. Нам нужно иметь возможность агрегировать по нескольким прогонам одного и того же сценария (с разными случайными начальными значениями), чтобы увидеть некоторые тренды (например, мин, макс, медиана, среднее). Как вы можете себе представить, попытка обойти все эти файлы CSV - это кошмар; за один прогон создается несколько файлов, и, как я уже сказал, некоторые из них огромны. По этой причине мы пытались перейти к решению HDF5, где все данные для исследования хранятся в одном месте, а не разбросаны по десяткам простых текстовых файлов. Кроме того, поскольку это двоичный формат файла, он должен быть в состоянии получить значительную экономию пространства по сравнению с несжатым CSVS.
Как показано на диаграмме, текущая постобработка необработанных выходных данных, полученных при моделировании, также происходит в Java и считывается в файлы CSV, полученные при локальном выводе. Этот модуль постобработки использует JFreeChart для создания некоторых диаграмм и графиков, связанных с симуляцией.
Эта проблема
Как я упоминал ранее, CSV действительно несостоятельны и плохо масштабируются, так как мы генерируем все больше и больше данных из моделирования. Кроме того, код пост-обработки делает больше, чем должен был, по сути, выполняет работу очень, очень плохой человеческой реляционной базы данных (объединяет "таблицы" (файлы CSV) на основе внешних ключей (уникальных идентификаторов агентов). В этой системе также трудно визуализировать данные другими способами (например, Prefuse, Processing, JMonkeyEngine, получая некоторое подмножество необработанных данных для воспроизведения в MatLab или SPSS).
Решение?
Моя группа решила, что нам действительно нужен способ фильтрации и запросов к имеющимся у нас данным, а также выполнения объединений между таблицами. Учитывая, что это ситуация с однократной записью и многократным чтением, нам действительно не нужны издержки реальной реляционной базы данных; вместо этого нам просто нужен какой-то способ добавить лучший внешний вид в файлы HDF5. Я нашел несколько статей по этому поводу, например, одну из которых описывает, как использовать XQuery в качестве языка запросов для файлов HDF5, но в статье описывается необходимость написания компилятора для преобразования из XQuery/XPath в собственные вызовы HDF5, что выходит далеко за рамки наших потребностей. Введите PyTables. Похоже, он делает именно то, что нам нужно (предоставляет два разных способа запроса данных, либо через понимание списка Python, либо через поиск в ядре (уровень C).
Предложенная архитектура, которую я представляю, такова:
На самом деле я не совсем уверен, как это сделать - связать воедино код Python, который будет написан для запросов, с кодом Java, который обслуживает файлы HDF5, и кодом Java, который выполняет постобработку данных. Очевидно, я захочу переписать большую часть кода постобработки, который неявно выполняет запросы, и вместо этого пусть превосходные PyTables делают это намного более элегантно.
Параметры Java/Python
Простой поиск в Google приводит к нескольким вариантам взаимодействия между Java и Python, но я настолько новичок в этой теме, что ищу какой-то реальный опыт и критику предлагаемой архитектуры. Похоже, что процесс Python должен выполняться на том же компьютере, что и Datahose, так что большие файлы .h5 не нужно передавать по сети, а гораздо меньшие, отфильтрованные представления будут передаваться клиентам. Поджигатель кажется интересным выбором - у кого-нибудь есть опыт с этим?