2017-12-01 24 views
1

내 응용 프로그램에 xlsx-chart 노드 모듈을 사용하고 있습니다. 이 모듈은 메모리를 사용하여 데이터 포인트에서 Excel 차트를 생성합니다. 내가 너무 많은 데이터가있을 때 때때로 지적이처럼 내 노드 JS 응용 프로그램 충돌 : 처음에Nodejs V8 GC가 Excel 생성 파일에서 크래시 전에 알립니다.

<--- Last few GCs ---> 

[6420:000000CD560122F0] 77691 ms: Mark-sweep 2047.4 (2086.4) -> 2047.4 (2086.4) MB, 1235.2/0.1 ms allocation failure GC in old space 
requested 
[6420:000000CD560122F0] 79246 ms: Mark-sweep 2047.4 (2086.4) -> 2047.4 (2086.4) MB, 1141.2/0.0 ms last resort 
[6420:000000CD560122F0] 80808 ms: Mark-sweep 2047.4 (2086.4) -> 2047.4 (2086.4) MB, 1561.1/0.0 ms last resort 


<--- JS stacktrace ---> 

==== JS stack trace ========================================= 

Security context: 000001D77B79BBE9 <JS Object> 
    2: /* anonymous */ [C:\XXXX\base64.js:~7] [pc=000001A01E7EC475](this=000000BA 
08CE36B1 <an Object with map 0000038E23FBE9A9>,input=0000017D18202201 <Very long string[50266376]>,utf8=000001D77B782241 <undefined>) 
    3: arguments adaptor frame: 1->2 
    4: generate [C:\XXXXX 

내가 시도 및 캐치 블록 내부 엑셀 파일 기능을 호출 할 장소를 넣어려고 같은 힙 오류가 발생하는 경우 그 난 그냥 사용자에게 올바른 메시지를 보내고 내 서버를 다시 시작합니다. 하지만 GC는 try catch 오류와 독립적으로 발생합니다.

내 주된 질문은 CG 충돌 이전에 사용자에게 어떻게 응답을 보내고 이러한 충돌이 발생하면 어떻게 자동으로 서버를 다시 시작할 수 있는지입니다.

감사

답변

2

당신은 당신의 node.js 프로세스가 사용할 수있는 최대 메모리를 증가 --max-old-space-size로 사용할 수 있습니다.

그리고 언제든지 PM2 도구를 사용하여 응용 프로그램을 다시 시작할 수 있습니다.


하지만 나는 당신이 당신의 파일을 생성 할 때 제한이 무엇인지 찾을 수를 운영자 추천. 또한, 생성하려는 파일에 따라 node.js가 취할 수있는 최대 크기를 지정합니다. 또는 excre 세대를 restreint. node.js는 결코이 오류를 발생시키지 않아야합니다.

+0

감사합니다. xlsx-chart moduole을 사용할 때 실제로 어떻게 예측할 수 있는지 알 수는 없지만 데이터 크기에 액세스 할 수는 있지만 기록 할 데이터의 실제 크기로 어떻게 변환 할 수 있는지 알지 못합니다. 엑셀 파일에. 한가지 다른 점은 --max_old_space_size가 좋은 옵션이지만 여전히 최대 --max_old_space_size에 도달하면 충돌합니다. 난 그저 충돌 전에 프로세스를 종료하고 사용자에게 엑셀 파일이 너무 커서 생성 될 수있는 대답을 보내길 원할뿐입니다. – Sam

+0

내가 볼 수있는 유일한 것은 벤치마킹입니다. node.js 프로세스가 Excel을 처리하지 않고 얼마만큼 사용하고 있는지 살펴보십시오. 그런 다음 창작물을 불러서 지금 얼마나 걸리는지 살펴보십시오. 그런 다음 여러 세대에 걸쳐 시도해보십시오. 그러면 계산하려는 대상과 기억의 결과에 대한 아이디어를 얻을 수 있습니다. –

+0

@Sam 모듈 프로세스에는 [memoryUsage] (https://nodejs.org/api/process.html#process_process_memoryusage)라는 메소드가 있습니다.이 메소드를 사용하면 죽음에 가까울 때 (최대 메모리) 생성을 능가하고 오류를 던집니다. 그러나 그것은 매우 예측 불가능합니다. –