【问题标题】:Netlogo - how to read a part of the data from txt/CSV files during simulationNetlogo - 如何在模拟过程中从 txt/CSV 文件中读取部分数据
【发布时间】:2019-01-21 02:28:30
【问题描述】:

我有一个包含包裹信息列表的非常大的文件。我将每个地块建模为模型中具有独特属性的代理。总共有 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 文件读取文件)

【问题讨论】:

  • 在加载所有代理时,您是否还会遇到内存越界问题?您可能想退后一步,质疑对所有这些进行建模是否有好处,或者您是否可以在给定初始代理集的情况下找到趋势。或者,这可能是飞重模式的良好候选者。
  • 我不会面对OOM,因为完成任务的agent会死,所以特定时间的agent总数不会是agent的总数。这可以大大加快我的模型。我必须明确地为每个包裹建模,因为它具有不同的方向和其他属性以用于分类和运输目的。该模型用于解决实际问题,因此实际包裹运单号与每个包裹相关联。我不能减少与学术研究不同的人口

标签: netlogo


【解决方案1】:

我将给出一个很好的文件 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

【讨论】:

  • 非常感谢,但我不希望模型在每次滴答时都读取文件,这会显着减慢模型速度。我正在考虑一种读取下一个 120 个刻度的数据的方法,因此我只需要在模拟时间(1440 分钟或 24 小时作为运行长度)期间读取数据 12 次。我可以做的一种方法是使用 csv:from-file "parcel.csv" 将所有数据加载到列表列表中,并从列表中执行数据提取以在接下来的 120 个滴答声中每 120 个滴答声生成代理。或者我仍然可以使用文件读取来导入数据并将它们分组为附加到表键的列表。
  • 对,所以我的建议是按照同样的趋势继续从列表中读取,直到到达时间大,然后杀死加载函数。或者,您可以触发加载功能在每滴答 120 个时间步长发生一次(如果滴答 mod 120 = 0 [load-next-agents ticks])。如果将文本文件存储为数组,则可以只使用刻度来跟踪当前索引并继续从列表中读取,直到 arr-time - 120 > ticks
  • 我已经成功完成了。我的模型速度提高了 10 倍。最初我需要超过 30 分钟才能运行,但现在只需 3 分钟。因此可以得出结论,模型中同时存在的代理数量将在很大程度上影响模拟速度和内存使用情况。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2018-11-12
相关资源
最近更新 更多