#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)
Результирующий набор представляет собой интерфейс:
Это 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 /