从 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 数据库中导出数据的主要内容,如果未能解决你的问题,请参考以下文章

Teradata 中数据计算和导出

怎样在MySQL数据库中导出整个数据库

如何使用 Ajax 从数据表中导出所有行?

从Navicat中导出数据成Excel表怎么转化成文本格式

通过sqoop工具从hive仓库中导出数据到mysql表中,只有部分数据导出,是什么原因

如何从 GAE 数据存储中导出 BLOB 类型字段?