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

Netlogo - how to read a part of the data from txt/CSV files during simulation

我有一个非常大的文件,其中包含包裹信息列表。我将每个地块建模为在我的模型中具有独特属性的代理。共有230万个包裹

问题是,如果我在设置过程中一次读取所有包裹并将它们创建为代理,它将占用大量内存,并且可能会在最初的几个滴答时导致 OOM。因此,我不得不在模拟过程中改变策略,批量导入数据和创建代理运行。

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

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 个刻度(分钟)读取一次文件读取命令以读取接下来的 120 分钟数据并创建在此期间到达的代理。因此,可以减少我的模拟世界中的代理总数,以防止 "Out of Memory",尤其是在执行并行 运行 时。 (顺便说一下,我更喜欢用 .txt 文件读取文件)

我将给出一个很好的文件 io 示例。我特别不打算使用 csv 扩展名,因为它会读取完整的文件。

本质上,这个想法是,如果它是当前刻度,则逐行加载文件的代理。您需要解析行并将 arr-time 转换为 int。您还需要在模拟中的每个刻度调用此函数(花费时间,但节省 space!)

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