【问题标题】:error (ArrayIndexOutOfBoundsException) with very large world in NetLogo 3DNetLogo 3D 中世界非常大的错误 (ArrayIndexOutOfBoundsException)
【发布时间】:2014-04-18 21:42:54
【问题描述】:

当我开始使用 Netlogo 构建 3D 模型时,首先我将 3D 模型设置更改为 2000*2000*500,这是我需要的尺寸。 然后我写了一个非常简单的代码进行测试。

breed [airs air]

to setup
  clear-all
  create-airs 1 [
    set color pink
    setxyz 1000 1000 250
    set heading 0
    set pitch 0
  ]
end  

然后我尝试运行设置命令,运行时错误出来了。

error (ArrayIndexOutOfBoundsException)
 while observer running CREATE-AIRS
  called by procedure SETUP
  called by Button 'setup'

NetLogo is unable to supply you with more details about this error.  Please report the problem
at https://github.com/NetLogo/NetLogo/issues, or to bugs@ccl.northwestern.edu, and paste the
contents of this window into your report.

java.lang.ArrayIndexOutOfBoundsException: 2006002500
 at org.nlogo.agent.World3D.getPatchAtWrap(World3D.java:159)
 at org.nlogo.agent.Turtle3D.getPatchHere(Turtle3D.java:183)
 at org.nlogo.agent.Turtle3D.<init>(Turtle3D.java:88)
 at org.nlogo.agent.Turtle3D.<init>(Turtle3D.java:62)
 at org.nlogo.agent.World3D.createTurtle(World3D.java:401)
 at org.nlogo.prim._createturtles.perform(_createturtles.java:51)
 at org.nlogo.nvm.Context.stepConcurrent(Context.java:91)
 at org.nlogo.nvm.ConcurrentJob.step(ConcurrentJob.java:82)
 at org.nlogo.job.JobThread.org$nlogo$job$JobThread$$runPrimaryJobs(JobThread.scala:143)
 at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:78)
 at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76)
 at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76)
 at scala.util.control.Exception$Catch.apply(Exception.scala:88)
 at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
 at org.nlogo.job.JobThread.run(JobThread.scala:75)

NetLogo 3D 5.0.5
main: org.nlogo.app.AppFrame
thread: JobThread
Java HotSpot(TM) Server VM 1.6.0_45 (Sun Microsystems Inc.; 1.6.0_45-b06)
operating system: Windows 8 6.2 (x86 processor)
Scala version 2.9.2
JOGL: 1.1.1
OpenGL graphics: Intel(R) HD Graphics 4400
OpenGL version: 4.2.0 - Build 10.18.10.3316
OpenGL vendor: Intel
model: airsimul

03:53:42.404 SwitchedTabsEvent (org.nlogo.app.Tabs) AWT-EventQueue-0
03:53:42.400 RuntimeErrorEvent (org.nlogo.app.App$$anon$1 (org.nlogo.window.GUIWorkspace)) AWT-EventQueue-0
03:53:42.392 JobRemovedEvent (org.nlogo.app.App$$anon$1 (org.nlogo.window.GUIWorkspace)) JobThread
03:53:42.391 PeriodicUpdateEvent (org.nlogo.app.App$$anon$1 (org.nlogo.window.GUIWorkspace)) AWT-EventQueue-0
03:53:42.391 TickStateChangeEvent (org.nlogo.app.App$$anon$1 (org.nlogo.window.GUIWorkspace)) JobThread
03:53:42.391 OutputEvent (org.nlogo.app.App$$anon$1 (org.nlogo.window.GUIWorkspace)) AWT-EventQueue-0
03:53:42.386 AddJobEvent (org.nlogo.window.ButtonWidget) AWT-EventQueue-0
03:53:42.261 InputBoxLoseFocusEvent (org.nlogo.window.ButtonWidget) AWT-EventQueue-0
03:53:42.212 PeriodicUpdateEvent (org.nlogo.app.App$$anon$1 (org.nlogo.window.GUIWorkspace)) AWT-EventQueue-0
03:53:42.011 PeriodicUpdateEvent (org.nlogo.app.App$$anon$1 (org.nlogo.window.GUIWorkspace)) AWT-EventQueue-0

谁能告诉我这是怎么回事?

【问题讨论】:

    标签: 3d netlogo


    【解决方案1】:

    请参阅How to model a very large world in NetLogo?http://ccl.northwestern.edu/netlogo/docs/faq.html#howbig,并回复:特别是 Windows,https://github.com/NetLogo/NetLogo/issues/423

    (虽然我无法解释为什么你得到 ArrayIndexOutOfBoundsException 而不是我所期望的 OutOfMemoryError。你在得到前者之前得到后者吗?)

    NetLogo 中的内存使用与代理的数量成正比。你的世界有多少个补丁?你关于你的世界大小的陈述有点模棱两可。如果你启动 NetLogo 并在对话框中输入 2000、2000 和 500,结果世界是 4001 * 4001 * 1001,因为你输入的数字是最大值,但补丁坐标也可以是负数。

    4001 * 4001 * 1001 是 160 亿个补丁。默认情况下,NetLogo 的堆大小为 1 GB。我刚刚进行了实验,发现我可以在这么多的内存中存储大约 200 万个补丁。 (这并不是试图对补丁做任何事情,而是首先创建它们;实际上对它们做任何事情都需要额外的内存。多少取决于我在做什么。)

    如果 1 GB 的 RAM 可以容纳大约 200 万个补丁,那么要拥有 160 亿个补丁,您将需要 8 TB 的 RAM。换句话说,您尝试的尺寸非常不切实际。

    更新:

    关于为什么你得到 ArrayIndexOutOfBoundsException 而不是 OutOfMemoryError,我现在有一个理论。

    在 NetLogo 中,补丁存储在一个大数组中。在 JVM 上,数组不能有超过 2147483647(约 21 亿)个元素,因为数组索引是有符号的 32 位整数。当 NetLogo 3D 创建补丁数组时,它会创建 new Patch[worldWidth * worldHeight * worldDepth]。因为 JVM 不会检测整数运算的溢出,所以您可能会得到错误的答案,例如在 Java 中 2000 * 2000 * 8000 等于 1935228928 (?!)。如果您尝试创建的世界尺寸足够大,整数溢出可能会导致 NetLogo 为补丁数组计算错误的大小。然后补丁数组的创建可能会成功,但一些访问补丁的尝试会失败并出现 ArrayIndexOutOfBoundsException,因为数组对于提供的世界维度来说太小了。

    请注意,只有当您尝试的世界规模远远超出可能的范围时,才会发生这种情况。 21 亿个补丁大约需要 1 TB 的 RAM,无论您使用的是 32 位还是 64 位启动器,这都行不通。

    【讨论】:

    • 非常感谢您的回答。我已经阅读了可能找到的帖子。原来问题出在 netlogo 的 32 位启动器上。现在唯一可行的方法是使用从命令行启动的无头 netlogo 或从 Windows 逃逸。似乎我想建立的世界是不可能的,我试图以 2D 的方式表示 3D 世界,这可能会减少所需的内存。再次感谢您,我们可能需要 64 位启动器。
    • 我也很困惑为什么会收到 ArrayIndexOutOfBoundsException 错误,我也遇到了 OutOfMemoryError。由于我不是真正的java专家,所以我不明白arrayindexoutofbounds是什么意思,你知道可能的原因吗?我可能会再次遇到它。
    • 假设我有一个大小为 10 的数组,它的元素编号为 0 到 9。如果我尝试访问项目 -1 或项目 10,那就是 ArrayIndexOutOfBoundsException。它本身携带的信息很少。
    • 我已经用一个关于 ArrayIndexOutOfBoundsException 可能如何发生的理论更新了我的答案。
    • Re: 64 位启动器,您可以自己从命令行启动 GUI NetLogo(不仅仅是无头 NetLogo),使用您想要的任何 JVM 和您想要的任何内存设置。您无需等待我们提供 64 位启动器。为方便起见,我们提供了一个启动器,但不要求使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多