찾다

 >  Q&A  >  본문

node.js - nodejs 队列大数组内存溢出

报错如下
FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

我的代码

connection.query('select * from `table` limit 100000', function(err, rows, fields) {
数据库里的链接大概做了个队列 就是 不断取数据 大概每次做 1W 大多时候 运行不稳定 出如上报错

var array = [1,2,3,4];
function check()
{
if(array.length > 0)
var url = array.pop();
load(url);
}}
function load(url)
{
http.get(url, function(res){
check();
)
}}

http://stackoverflow.com/ques... 跟这个情况类似
请问怎么解决比较好 能不能不断清楚内存的垃圾?

PHP中文网PHP中文网2873일 전471

모든 응답(1)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 15:53:41

    • 올바르게 계산하면 10만 개의 레코드를 한 번에 꺼내는 셈입니다. 레코드 한 행을 10K로 추정하면 10만 개의 레코드는 약 1G의 메모리이므로 OOM이 발생합니다

    • 이 문제를 해결하는 가장 좋은 방법은 流处理입니다. 각 highWaterMark을 10,000으로 설정합니다. 예를 들어, 가져올 데이터는 총 100만 개입니다. 배열을 제어하고 코드 아래에 로드할 필요가 없습니다. 한 번에 10,000개를 처리하는 ReadStream

    • 을 작성하세요.
    • 대화가 저렴합니다. 코드를 보여주세요

    으아악
    • 의사코드는 위와 같으며, untest실제 업무에 맞게 변경하세요

    참고: 데이터를 읽는 데 ReadStreamhighWaterMark을 mysql 스트림보다 크게 설정하는 것이 가장 좋습니다. 그렇지 않으면 consumer 데이터를 제때 사용할 수 없으면 데이터가 손실됩니다! !

    회신하다
    0
  • 취소회신하다