从 Anylogic 数据库中导出数据
Posted
技术标签:
【中文标题】从 Anylogic 数据库中导出数据【英文标题】:Export data from Anylogic database 【发布时间】:2021-02-14 06:02:03 【问题描述】:我一直在努力使用 Anylogic 导出模型数据。
一些上下文。在使用并行化运行参数变化实验(多次迭代和复制)时,我还没有找到一种系统的方法来收集数据以使用 Python 或 R 分析它们。所以,我只想运行实验并将输出保存在自定义位置(文件夹)。
到目前为止我所尝试的:
首先,我尝试了text file
Anylogic 功能,但它们不适用于并行设置(例如,并非所有行都被记录)
我尝试使用数据库,然后将数据导出到 Excel。但是我遇到了 Excel 大小限制的问题(大约 1M 行)。我正在探索多次迭代和复制,以使 Excel 文件无法正常工作。
我一直在尝试使用 R 和 Python 连接到数据库,但没有成功。尽管如此,我仍需要一些包装器将表格转换为可用于 R 或 Python 的格式。这需要在 Anylogic 中完成,因此每个实验数据都保存在给定的文件夹中。
使用 Python 连接到数据库
读取数据并将其转换为我可以独立使用的格式,比如 CSV 文件。
目前,唯一对我有用的是创建与我在实验中的迭代和复制一样多的 CSV 文件,因此,如果我有 10 次迭代,每次 100 次复制,我将获得 1000 个 CSV 文件我要收集的数据集。
另一种选择是使用 Java 将数据库(查询)转换为 csv 文件。在实验开始之前,我清除了所有数据库。在实验结束时,我想保存数据,并清除数据库,运行以下代码:
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)
ResultSet 是一个接口:
https://help.anylogic.com/index.jsp?topic=%2Fcom.anylogic.help%2Fhtml%2Fjavadoc%2Fcom%2Fanylogic%2Fengine%2Fconnectivity%2FResultSet.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】:要将 dbase 记录写入 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 记录都被写入唯一的 dbase 记录。您可以在运行时使用getCurrentReplication()
和getCurrentIteration()
来确保正确写入数据...
【讨论】:
谢谢,@Benjamin。我得到了包含我需要的所有信息的正确数据库。我的问题是我需要处理数据,但我不知道如何将包含数千条记录(超过 1M)的数据库导出到非 Excel 文件中。 @sdaza 看到我的第二个答案:) 谢谢,@Benjamin。我正在寻找一种更通用的解决方案,以使用 ResultSet 和 csvWriter 或 CsvRoutines 等方法从数据库中获取 CSV 文件,但它们不起作用。像这样的东西:gist.github.com/sdaza/2c55044c9dbfcc38c8e5d8ded0a84a17【参考方案3】:这对我有用,只是一个带有两个参数的函数:查询和文件名
这里有一个更一般的解释:https://sdaza.com/blog/2020/anylogic-database/
【讨论】:
以上是关于从 Anylogic 数据库中导出数据的主要内容,如果未能解决你的问题,请参考以下文章