Netlogo - как прочитать часть данных из файлов txt / CSV во время симуляции - PullRequest
0 голосов
/ 21 января 2019

У меня есть очень большой файл, содержащий список информации о посылках. Я смоделировал каждую посылку как агент с уникальными свойствами в моей модели. Всего имеется 2,3 млн. Посылок.

Проблема в том, что если я прочитал все посылки и создал их как агенты за один раз во время установки, он будет занимать большой объем памяти и потенциально вызовет 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)

1 Ответ

0 голосов
/ 21 января 2019

Я приведу хороший старый пример. В частности, я не собираюсь использовать расширение 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
...