netlogo - Netlogo - 如何在模拟过程中从 txt/CSV 文件中读取部分数据
问题描述
我有一个非常大的文件,其中包含包裹信息列表。我将每个地块建模为模型中具有独特属性的代理。总共有 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 滴答(分钟)运行一次文件读取命令以读取接下来的 120 分钟数据并创建在此期间到达的代理。因此,可以减少我的模拟世界中的代理总数,以防止“内存不足”,尤其是在执行并行运行时。(顺便说一下,我更喜欢使用 .txt 文件读取文件)
解决方案
我将给出一个很好的文件 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
推荐阅读
- arrays - Mongo查询数组是否包含值
- php - 在 CI 中,我想以 m_admin、m_faculty、m_supervisior 的身份登录我的数据库 namd 的 3 个不同数据库表中存在的 3 个不同 usr 角色帐户
- ruby-on-rails - 用 Faraday 替换 HTTParty.send
- python-3.x - 如何使用 python 和 iotHub 库在 azure 中请求设备连接字符串?
- twilio - new Twilio.TaskRouter.Workspace() 给出 WebSocket 意外响应代码:403
- python - 将列添加到现有数据框并将数据导入 Python Pandas 中的新列
- java - 延迟绘制形状
- azure - 需要 powershell 脚本来启用存储帐户和密钥保管库的诊断日志记录
- c++ - 为什么重载运算符“=”在我的动态数组类上不能正常工作?C++
- json - React js关于更新状态值的问题