NetLogo 3D中世界非常大的错误(ArrayIndexOutOfBoundsException)

NetLogo 3D中世界非常大的错误(ArrayIndexOutOfBoundsException),3d,netlogo,3d,Netlogo,当我开始使用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 然后我尝试运行setup命令,出现了运行时错误 erro

当我开始使用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  
然后我尝试运行setup命令,出现了运行时错误

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
有谁能告诉我这是关于什么的吗?

请参阅,特别是关于Windows

虽然我无法解释为什么你会得到ArrayIndexOutOfBoundsException,而不是我预期的OutOfMemoryError。你在得到前者之前得到后者了吗

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

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

如果1GB的RAM可以容纳大约200万个补丁,那么要获得160亿个补丁,就需要8TB的RAM。换句话说,你想要的尺寸是非常不现实的

更新:

关于为什么使用ArrayIndexOutOfBoundsException而不是OutOfMemoryError的问题,我现在有了一个理论

在NetLogo中,修补程序存储在一个大阵列中。在JVM上,数组不能超过2147483647~21亿个元素,因为数组索引是有符号32位整数。NetLogo 3D创建面片阵列时,会生成新面片[worldWidth*worldHeight*worldDepth]。因为JVM没有检测到整数操作的溢出,所以您可能会得到错误的答案,例如在Java2000*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位启动器,您可以使用任何JVM和任何内存设置,从命令行启动GUI NetLogo,而不仅仅是headless NetLogo。您不需要等待我们提供64位启动器。我们提供了一个方便的启动器,但使用它不是一个要求。