node.js - nodejs 队列大数组内存溢出
PHP中文网
PHP中文网 2017-04-17 15:51:41
0
1
447

报错如下
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中文网

认证高级PHP讲师

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

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

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

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

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

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿