Экспорт данных из базы данных Anylogic

#java #anylogic

#java #anylogic

Вопрос:

Я боролся с экспортом данных модели с помощью Anylogic.

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

Что я пробовал до сих пор:

  • Сначала я попробовал функции text file Anylogic, но они не работали при параллельной настройке (например, были записаны не все строки)
  • Я попытался использовать базы данных, а затем экспортировать данные в Excel. Но у меня была проблема с ограничением размера Excel (около 1 млн строк). Я изучаю несколько итераций и реплик, чтобы файлы Excel не работали.
  • Я безуспешно пытался подключиться к базе данных с помощью R и Python. Тем не менее, мне понадобится какая-то оболочка для преобразования таблиц в формат, который я могу использовать с R или Python. Это должно быть сделано в Anylogic, поэтому данные каждого эксперимента сохраняются в заданной папке.
    • Подключение к базе данных с помощью Python
    • Прочитайте данные и преобразуйте их в формат, который я могу использовать независимо, скажем, в файл CSV.
  • На данный момент единственное, что сработало для меня, это создать столько CSV-файлов, сколько итераций и реплик у меня есть в моем эксперименте, поэтому, если у меня будет 10 итераций по 100 реплик в каждой, я получу 1000 файлов CSV на набор данных, который я хочу собрать.
  • Другим вариантом может быть преобразование базы данных (запроса) в файл csv с использованием Java. Перед началом эксперимента я очищаю все базы данных. В конце эксперимента я хотел бы сохранить данные и очистить базы данных, запустив этот код:
 try {
    ResultSet rs = selectResultSet("SELECT * from MODEL_PARAMETERS");
    CSVWriter csvWriter = new CSVWriter(new FileWriter("output/model_parameters.csv"), 't');
    csvWriter.writeAll(rs, true);
    csvWriter.close();
    deleteFrom(model_parameters).execute();
} catch (IOException e)  {
    getEngine().pause();
    traceln("--> An Exception happened during initialization, continue? ...");
    e.printStackTrace();
}
  

Я получаю эту ошибку:

 The method writeAll(Iterable<String[]>, boolean) in the type CSVWriter is not applicable for the arguments (ResultSet, boolean)

  

Результирующий набор представляет собой интерфейс:

https://help.anylogic.com/index.jsp?topic=/com.anylogic.help/html/javadoc/com/anylogic/engine/connectivity/ResultSet.html

Это selectResultSet :

 selectResultSet
public ResultSet selectResultSet(java.lang.String sql,
                                 java.lang.Object... params)
Get the results as a result set object for the given sql and params
Parameters:
sql - string containing select query
params - array containing select query params
Returns:
ResultSet selected ResultSet
  

Есть идеи, как с этим справиться? Спасибо!

Ответ №1:

Для записи записей базы данных в формат CSV используйте эту настройку:

Создайте элемент «Текстовый файл» и настройте, как показано ниже: введите описание изображения здесь

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

 File outputDirectory = new File("outputs");
outputDirectory.mkdir();
String outputFileNameWithExtension = outputDirectory.getPath() File.separator "output_operations.csv";

file.setFile(outputFileNameWithExtension, Mode.WRITE_APPEND);

// create header
file.println(        "unique_id" "," "replication");

// Write data from dbase table                                
List<Tuple> rows = selectFrom(output_operations).list();

for (Tuple row : rows) {
        file.println(        row.get( output_operations.unique_id )   ","   
                                        row.get( output_operations.replication ));
}
file.close();
  

Ответ №2:

На данный момент единственное, что сработало для меня, это создать столько CSV-файлов, сколько итераций и реплик у меня есть в моем эксперименте, поэтому, если у меня будет 10 итераций по 100 реплик в каждой, я получу 1000 файлов CSV на набор данных, который я хочу собрать.

Чтобы сделать эту работу лучше, сначала запишите выходные данные в базу данных модели во время выполнения, а затем экспортируйте в 1 csv в самом конце всех запусков.

В ваших выходных таблицах базы данных имейте столбцы для номеров «итерации» и «репликации», чтобы гарантировать, что каждая запись абсолютно уникальна (в противном случае некоторые данные теряются при параллельных запусках, как вы также заметили).

Это работает и очень надежно (и быстро), это действительно сводится к тому, что любая запись dbase, выполняемая при любом параллельном запуске, записывается в уникальную запись dbase. Вы можете использовать getCurrentReplication() и getCurrentIteration() во время выполнения, чтобы убедиться, что данные записываются правильно…

Комментарии:

1. Спасибо, @Benjamin. Я получил правильные базы данных со всей необходимой мне информацией. Моя проблема в том, что мне нужно работать с данными, но я не знаю, как экспортировать базу данных с тысячами записей (более 1 млн) во что-то, что не является файлом Excel.

2. @sdaza смотрите мой второй ответ 🙂

3. Спасибо, @Benjamin. Я ищу более общее решение для получения CSV-файла из базы данных с использованием ResultSet и таких методов, как CSVWriter или CsvRoutines, но они не работают. Что-то вроде этого: gist.github.com/sdaza/2c55044c9dbfcc38c8e5d8ded0a84a17

Ответ №3:

Сейчас это работает для меня, просто функция с двумя параметрами: запрос и имя файла

введите описание изображения здесь

Вот более общее объяснение: https://sdaza.com/blog/2020/anylogic-database /