【问题标题】:Javascript Sorting. Allocation fail process out of memory errorJavascript 排序。分配失败进程内存不足错误
【发布时间】:2013-09-06 00:00:45
【问题描述】:

我的 Javascript 代码出现“致命错误:CALL_AND_RETRY_0 分配失败 - 进程内存不足”错误。我怎么能运行这段代码?我在代码中看不到任何缺陷,因为我所做的事情与在 Python 中完全相同,并且它在 Python 中工作,但在 Javascript 中我遇到了内存错误。下面是我的代码。

   var sample_arr = [-1, 5, 7, 4, 0, 1, -5]
   function My_Partition(container, first_index, last_index) {
       var x = container[last_index];
       var i = first_index - 1;

       for (var elem = 0; elem < container.length-1; elem++) {
               if (container[elem] <= x) {
               i += 1;
               var temp_1 = container[i];
               container[i] = container[elem];
               container[elem] = temp_1;
           }
       }
       var temp_2 = container[i+1];
       container[i+1] = container[last_index];
       container[last_index] = temp_2;

       return i+1;
   }


   function My_Quick_Sort(container, first_index, last_index) {
       if (first_index < last_index) {
           var mid = My_Partition(container, first_index, last_index);
           My_Quick_Sort(container, first_index, mid-1);
           My_Quick_Sort(container, mid+1, last_index);
       }
   }
   My_Quick_Sort(sample_arr, 0, sample_arr.length-1);
   console.log("Sorted Array:", sample_arr);

基本上我正在尝试实现排序算法, 非常感谢您的帮助。

【问题讨论】:

  • 你想通过这种方式达到什么目的?
  • 我正在尝试对一个混乱的数组进行排序以获得排序后的版本

标签: javascript memory-management out-of-memory quicksort


【解决方案1】:

这是一次非常壮观的崩溃。

因此,由于这看起来像是某种家庭作业/练习,与其回答问题,不如回答问题背后的问题:“我如何弄清楚如何解决这样的问题?”最好的方法通常是提出一个理论,然后找到一种测试方法。

理论 1:堆栈溢出

通常,如果内存不足,一个明显的猜测是堆栈溢出。为了测试它,让我们看看我们是否可以设置函数被调用的次数限制,并在JSFiddle 中运行它:

   var sample_arr = [-1, 5, 7, 4, 0, 1, -5];
   var stop_running = 0;
   function My_Partition(container, first_index, last_index) {
       if (stop_running++ > 100) return;
       ...
   }


   function My_Quick_Sort(container, first_index, last_index) {
       if (stop_running++ > 100) return;
       ...
   }
   My_Quick_Sort(sample_arr, 0, sample_arr.length-1);
   console.log("Sorted Array:", sample_arr);

哎呀!这仍然崩溃。猜猜这不是堆栈溢出,因为我们限制了调用两个函数的次数。

理论 2:循环

让我们尝试另一种理论。也许正在发生的是一个无限循环。让我们记录循环调用instead(点击查看 JSFiddle)。

请注意,它在循环中停留了 100 多次迭代。这对于简单的排序来说太多了。此时,您可能想要添加一个 console.log 调用并打印出局部变量。试试 console.log(elem) 或 console.log(container.length),或者两者兼而有之。

【讨论】:

  • 哦,非常感谢。我对 Javascript 很陌生,这种错误我从未见过。那么Javascript不能处理这种排序吗?我想知道我是否可以用 Javascript 方式解决这个问题,因为相同的代码适用于许多其他语言。我错过了什么?你能帮忙吗?这不是家庭作业。我只是自学。非常感谢!
  • 在 Python 中你使用的是 len() 对吗?在 Python 中尝试 print() len(),在 JavaScript 中尝试 console.log() container.length。你应该得到相同的号码,对吧?你呢?
  • Console.log 是您的朋友。看看这个版本,看看控制台:jsfiddle.net/ry2XE/3
  • 哦,很容易看出哪里出了问题。但仍然试图弄清楚如何使它正确。非常感谢!
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 2014-11-23
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2018-11-10
  • 2016-12-19
相关资源
最近更新 更多