NetLogo-如何在模拟过程中从txt / CSV文件读取部分数据

时间:2019-01-21 02:28:30

标签: netlogo

我有一个很大的文件,其中包含包裹信息列表。我在模型中将每个宗地建模为具有唯一属性的代理。总共有230万个包裹。

问题是,如果我在安装过程中一次读取所有宗地并将它们创建为代理,它们将占用大量内存,并可能在最初的几次变动中引起OOM。因此,我必须更改在仿真运行期间批量导入数据和创建代理的策略。

例如,我的数据看起来像这样:第一列是以分钟为单位的到达时间,第二列是每个宗地的属性。我运行模拟模型一滴答=一分钟,因此所有到达时间相同的包裹都会被激活以执行某些操作,一旦完成,它们就会死掉

arr_time    property
94  T6
197 T4
202 T4
252 T6
252 T6
252 T4
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
665 T4
665 T6
665 T6
665 T6
665 T6
665 T4
846 T4
1355    T4
1407    T6
1411    T6
1426    T6
1426    T6
1426    T6
1426    T6

实际文件远大于此文件。我不想一次读取一次文件,而是想在模拟运行期间多次读取文件,例如每隔120分钟(分钟)运行一次file-read命令,以读取接下来的120分钟数据并创建在此期间到达的业务代表。因此,可以减少我的仿真世界中的代理总数,以防止“内存不足”,尤其是在执行并行运行时。 (我更喜欢用.txt文件读取文件)

1 个答案:

答案 0 :(得分:1)

我将举一个很好的ol'file-io示例。我特别不打算使用csv扩展名,因为它将读取其中的完整文件。

基本上,这个想法是,如果是当前刻度,则逐行加载代理。您需要解析行并将arr-time转换为int。您还需要在仿真中的每个刻度上调用此函数(这样既省时又省空间!)

to load-agents
   file-open "my-file.txt"
   while [not file-at-end?]
   [
     let line file-readline
     let delimiter-index position " " line
     let arr-time read-from-string substring 0 delimiter-index
     let property substring (delimiter-index + 1) length line
     if arr-time > ticks [file-close stop]
     if arr-time = ticks [load-agent arr-time property]
   ] 
end