报错如下
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中文网2017-04-17 15:53:41
올바르게 계산하면 10만 개의 레코드를 한 번에 꺼내는 셈입니다. 레코드 한 행을 10K로 추정하면 10만 개의 레코드는 약 1G의 메모리이므로 OOM이 발생합니다
이 문제를 해결하는 가장 좋은 방법은 流处理
입니다. 각 highWaterMark
을 10,000으로 설정합니다. 예를 들어, 가져올 데이터는 총 100만 개입니다. 배열을 제어하고 코드 아래에 로드할 필요가 없습니다. 한 번에 10,000개를 처리하는 ReadStream
대화가 저렴합니다. 코드를 보여주세요
의사코드는 위와 같으며, untest
실제 업무에 맞게 변경하세요
참고: 데이터를 읽는 데
ReadStream
의highWaterMark
을 mysql 스트림보다 크게 설정하는 것이 가장 좋습니다. 그렇지 않으면consumer
데이터를 제때 사용할 수 없으면 데이터가 손실됩니다! !