如何增加堆栈大小以允许更多递归? [英] How to increase stack size to allow more recursion?

查看:41
本文介绍了如何增加堆栈大小以允许更多递归?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在处理中运行递归方法,但是当作业太大时,它给了我这个错误:

I'm running a recursion method in processing, but when the job is too big, it give me this error:

由于在等待时发生超时而在事件线程中崩溃数据包 139.

crashed in event thread due to Timeout occurred while waiting for packet 139.

但它在递归很小的时候有效.有没有办法增加堆栈以解决更大的递归问题?

But it works when the recursion is small. Is there any way to increase the stack for bigger recursion problems?

这是我的代码,用于在屏幕上绘制图形.它适用于小人物,但不适用于大人物.

This is my code is for painting figures on the screen. It works for small figures, but not for bigger ones.

boolean pit;
int xc;
int yc;
color negro;
color rojo;
color c;
long tiempoI;
long tiempoF;
long espera;
void setup(){
  size(500,500);
  negro=color(0,0,0);
  negro=color(0,0,0);
  rojo=#FF0000;
  pit=false;
  tiempoI=millis();
  tiempoF=millis();
  espera=5;
}
void draw(){
  background(240);
  noSmooth();
  //dibujarRectangulo(0,0,300,300);
  rect(0,0,100,100);
  if(pit){
    pintar(xc,yc);
  }
}
void mousePressed() {
  xc=mouseX;
  yc=mouseY;
  pit=true;
  loadPixels();
  c=pixels[xc+(width*yc)];
  println(red(c)+" "+green(c)+" "+blue(c));


}
public void pintar(int x,int y){
  if(x<width&&x>0&&y<height&&y>0){
    stroke(rojo);
    c=get(x,y);
    if(c!=rojo&&c!=negro){
      point(x,y);
    }
    c=get(x+1,y);
    if(c!=rojo&&c!=negro){
      pintar(x+1,y);
    }

    c=get(x-1,y);
    if(c!=rojo&&c!=negro){
      pintar(x-1,y);
    }

    c=get(x,y+1);
    if(c!=rojo&&c!=negro){
      pintar(x,y+1);
    }

    c=get(x,y-1);
    if(c!=rojo&&c!=negro  ){
      pintar(x,y-1);
    }

  }
}

回溯:

由于在等待时发生超时而在事件线程中崩溃数据包 139. org.eclipse.jdi.TimeoutException: Timeout发生而等待数据包 139. 在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186)在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226)在org.eclipse.jdi.internal.ThreadReferenceImpl.frames(ThreadReferenceImpl.java:257)在org.eclipse.jdi.internal.ThreadReferenceImpl.frames(ThreadReferenceImpl.java:240)在 processing.mode.java.runner.Runner.findException(Runner.java:888)在processing.mode.java.runner.Runner.reportException(Runner.java:871)在 processing.mode.java.runner.Runner.exceptionEvent(Runner.java:797)在 processing.mode.java.runner.Runner$2.run(Runner.java:688)org.eclipse.jdi.TimeoutException: 等待时发生超时数据包 140. 在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186)在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226)在org.eclipse.jdi.internal.VirtualMachineImpl.exit(VirtualMachineImpl.java:716)在 processing.mode.java.runner.Runner.close(Runner.java:961) 在processing.mode.java.JavaEditor.handleStop(JavaEditor.java:728) 在processing.mode.java.JavaToolbar.handlePressed(JavaToolbar.java:96)在 processing.app.EditorToolbar.mousePressed(EditorToolbar.java:474)在 java.awt.Component.processMouseEvent(Unknown Source) 在javax.swing.JComponent.processMouseEvent(Unknown Source) atjava.awt.Component.processEvent(Unknown Source) atjava.awt.Container.processEvent(Unknown Source) atjava.awt.Component.dispatchEventImpl(Unknown Source) atjava.awt.Container.dispatchEventImpl(Unknown Source) atjava.awt.Component.dispatchEvent(Unknown Source) atjava.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) atjava.awt.LightweightDispatcher.processMouseEvent(Unknown Source) atjava.awt.LightweightDispatcher.dispatchEvent(Unknown Source) atjava.awt.Container.dispatchEventImpl(Unknown Source) atjava.awt.Window.dispatchEventImpl(Unknown Source) atjava.awt.Component.dispatchEvent(Unknown Source) atjava.awt.EventQueue.dispatchEventImpl(Unknown Source) atjava.awt.EventQueue.access$200(Unknown Source) atjava.awt.EventQueue$3.run(Unknown Source) atjava.awt.EventQueue$3.run(Unknown Source) atjava.security.AccessController.doPrivileged(Native Method) 在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在 java.awt.EventQueue$4.run(Unknown Source) 在java.awt.EventQueue$4.run(Unknown Source) atjava.security.AccessController.doPrivileged(Native Method) 在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在 java.awt.EventQueue.dispatchEvent(Unknown Source) 在java.awt.EventDispatchThread.pumpOneEventForFilters(来源不明)在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源)在 java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown来源)在 java.awt.EventDispatchThread.pumpEvents(来源不明)在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在java.awt.EventDispatchThread.run(来源不明)org.eclipse.jdi.TimeoutException: 等待时发生超时数据包 141. 在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186)在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226)在org.eclipse.jdi.internal.VirtualMachineImpl.exit(VirtualMachineImpl.java:716)在 processing.mode.java.runner.Runner.close(Runner.java:961) 在processing.mode.java.JavaEditor.handleStop(JavaEditor.java:728) 在processing.mode.java.JavaToolbar.handlePressed(JavaToolbar.java:96)在 processing.app.EditorToolbar.mousePressed(EditorToolbar.java:474)在 java.awt.Component.processMouseEvent(Unknown Source) 在javax.swing.JComponent.processMouseEvent(Unknown Source) atjava.awt.Component.processEvent(Unknown Source) atjava.awt.Container.processEvent(Unknown Source) atjava.awt.Component.dispatchEventImpl(Unknown Source) atjava.awt.Container.dispatchEventImpl(Unknown Source) atjava.awt.Component.dispatchEvent(Unknown Source) atjava.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) atjava.awt.LightweightDispatcher.processMouseEvent(Unknown Source) atjava.awt.LightweightDispatcher.dispatchEvent(Unknown Source) atjava.awt.Container.dispatchEventImpl(Unknown Source) atjava.awt.Window.dispatchEventImpl(Unknown Source) atjava.awt.Component.dispatchEvent(Unknown Source) atjava.awt.EventQueue.dispatchEventImpl(Unknown Source) atjava.awt.EventQueue.access$200(Unknown Source) atjava.awt.EventQueue$3.run(Unknown Source) atjava.awt.EventQueue$3.run(Unknown Source) atjava.security.AccessController.doPrivileged(Native Method) 在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在 java.awt.EventQueue$4.run(Unknown Source) 在java.awt.EventQueue$4.run(Unknown Source) atjava.security.AccessController.doPrivileged(Native Method) 在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在 java.awt.EventQueue.dispatchEvent(Unknown Source) 在java.awt.EventDispatchThread.pumpOneEventForFilters(来源不明)在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源)在 java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown来源)在 java.awt.EventDispatchThread.pumpEvents(来源不明)在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在java.awt.EventDispatchThread.run(来源不明)org.eclipse.jdi.TimeoutException: 等待时发生超时数据包 142. 在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186)在org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191)在 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226)在org.eclipse.jdi.internal.VirtualMachineImpl.exit(VirtualMachineImpl.java:716)在 processing.mode.java.runner.Runner.close(Runner.java:961) 在processing.mode.java.JavaEditor.handleStop(JavaEditor.java:728) 在processing.mode.java.JavaToolbar.handlePressed(JavaToolbar.java:96)在 processing.app.EditorToolbar.mousePressed(EditorToolbar.java:474)在 java.awt.Component.processMouseEvent(Unknown Source) 在javax.swing.JComponent.processMouseEvent(Unknown Source) atjava.awt.Component.processEvent(Unknown Source) atjava.awt.Container.processEvent(Unknown Source) atjava.awt.Component.dispatchEventImpl(Unknown Source) atjava.awt.Container.dispatchEventImpl(Unknown Source) atjava.awt.Component.dispatchEvent(Unknown Source) atjava.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) atjava.awt.LightweightDispatcher.processMouseEvent(Unknown Source) atjava.awt.LightweightDispatcher.dispatchEvent(Unknown Source) atjava.awt.Container.dispatchEventImpl(Unknown Source) atjava.awt.Window.dispatchEventImpl(Unknown Source) atjava.awt.Component.dispatchEvent(Unknown Source) atjava.awt.EventQueue.dispatchEventImpl(Unknown Source) atjava.awt.EventQueue.access$200(Unknown Source) atjava.awt.EventQueue$3.run(Unknown Source) atjava.awt.EventQueue$3.run(Unknown Source) atjava.security.AccessController.doPrivileged(Native Method) 在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在 java.awt.EventQueue$4.run(Unknown Source) 在java.awt.EventQueue$4.run(Unknown Source) atjava.security.AccessController.doPrivileged(Native Method) 在java.security.ProtectionDomain$1.doIntersectionPrivilege(未知)来源)在 java.awt.EventQueue.dispatchEvent(Unknown Source) 在java.awt.EventDispatchThread.pumpOneEventForFilters(来源不明)在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源)在 java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown来源)在 java.awt.EventDispatchThread.pumpEvents(来源不明)在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在java.awt.EventDispatchThread.run(来源不明)

crashed in event thread due to Timeout occurred while waiting for packet 139. org.eclipse.jdi.TimeoutException: Timeout occurred while waiting for packet 139. at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186) at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226) at org.eclipse.jdi.internal.ThreadReferenceImpl.frames(ThreadReferenceImpl.java:257) at org.eclipse.jdi.internal.ThreadReferenceImpl.frames(ThreadReferenceImpl.java:240) at processing.mode.java.runner.Runner.findException(Runner.java:888) at processing.mode.java.runner.Runner.reportException(Runner.java:871) at processing.mode.java.runner.Runner.exceptionEvent(Runner.java:797) at processing.mode.java.runner.Runner$2.run(Runner.java:688) org.eclipse.jdi.TimeoutException: Timeout occurred while waiting for packet 140. at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186) at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226) at org.eclipse.jdi.internal.VirtualMachineImpl.exit(VirtualMachineImpl.java:716) at processing.mode.java.runner.Runner.close(Runner.java:961) at processing.mode.java.JavaEditor.handleStop(JavaEditor.java:728) at processing.mode.java.JavaToolbar.handlePressed(JavaToolbar.java:96) at processing.app.EditorToolbar.mousePressed(EditorToolbar.java:474) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) org.eclipse.jdi.TimeoutException: Timeout occurred while waiting for packet 141. at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186) at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226) at org.eclipse.jdi.internal.VirtualMachineImpl.exit(VirtualMachineImpl.java:716) at processing.mode.java.runner.Runner.close(Runner.java:961) at processing.mode.java.JavaEditor.handleStop(JavaEditor.java:728) at processing.mode.java.JavaToolbar.handlePressed(JavaToolbar.java:96) at processing.app.EditorToolbar.mousePressed(EditorToolbar.java:474) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) org.eclipse.jdi.TimeoutException: Timeout occurred while waiting for packet 142. at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186) at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:197) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226) at org.eclipse.jdi.internal.VirtualMachineImpl.exit(VirtualMachineImpl.java:716) at processing.mode.java.runner.Runner.close(Runner.java:961) at processing.mode.java.JavaEditor.handleStop(JavaEditor.java:728) at processing.mode.java.JavaToolbar.handlePressed(JavaToolbar.java:96) at processing.app.EditorToolbar.mousePressed(EditorToolbar.java:474) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

推荐答案

您的错误确实是由太多递归引起的 StackOverflow,但是 Processing 用您看到的奇怪错误掩盖了这一点.有关该错误的文档位于此处.

Your error is indeed a StackOverflow caused by too much recursion, but Processing covers that up with the strange error you're seeing. Documentation on that bug is here.

您可以增加 Java 堆栈大小以增加递归调用的限制.可以在此处找到信息,但要点是您必须在运行时将 -Xss 设置传递给 Java.

You can increase the Java stack size to increase the limit of recursive calls. Info can be found here, but the gist is that you have to pass the -Xss setting into Java at runtime.

但是,该设置要求您将草图作为 Java 应用程序运行.这是可能的,但它涉及将您的草图导出为 jar,然后通过命令提示符运行 jar,或切换到 eclipse.这比简单地点击 Processing 中的运行按钮要多得多,而且您发送 jar 的任何用户都必须这样做.

However, that setting requires that you run your sketch as a Java application. This is possible, but it involves exporting your sketch as a jar, then running the jar via the command prompt, or switching to eclipse. That's a lot more work than simply hitting the run button in Processing- and any users you send your jar would have to do the same.

相反,您可能应该重构您的算法以消除过度递归.

Instead, you should probably refactor your algorithm to eliminate the excessive recursion.

这篇关于如何增加堆栈大小以允许更多递归?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆