Node.js स्मृति से बाहर ढेर


247

आज मैंने RAID फाइल को इंडेक्स करने के लिए फाइलसिस्टम इंडेक्सिंग के लिए अपनी स्क्रिप्ट चलाई और 4h के बाद यह निम्न त्रुटि के साथ क्रैश हो गया:

[md5:]  241613/241627 97.5%  
[md5:]  241614/241627 97.5%  
[md5:]  241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)

<--- Last few GCs --->

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].


<--- JS stacktrace --->

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

Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n  >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/usr/bin/node]
 2: 0xe2c5fc [/usr/bin/node]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
 5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
 6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
 7: 0x3629ef50961b

सर्वर 16 जीबी रैम और 24 जीबी एसएसडी स्वैप से लैस है। मुझे बहुत संदेह है कि मेरी स्क्रिप्ट 36gb मेमोरी से अधिक थी। कम से कम यह नहीं होना चाहिए

स्क्रिप्ट फ़ाइल मेटाडाटा (संशोधन तिथियां, अनुमति, आदि, कोई बड़ा डेटा नहीं) के साथ वस्तुओं के सरणी के रूप में संग्रहीत फ़ाइलों का सूचकांक बनाता है

यहां पूरी स्क्रिप्ट कोड: http://pastebin.com/mjaD76c3 है

मैंने पहले से ही इस स्क्रिप्ट के साथ अजीब नोड मुद्दों का अनुभव किया है जो मुझे मजबूर करता है जैसे। स्ट्रिंग के रूप में बड़ी फ़ाइलों पर काम करते समय नोड के रूप में कई फाइलों में विभाजित सूचकांक को विभाजित किया गया था। क्या विशाल डेटासेट के साथ नोडज स्मृति प्रबंधन में सुधार करने का कोई तरीका है?

जवाबों:


315

अगर मुझे सही से याद है, तो लगभग 1.7 जीबी के V8 में मेमोरी के उपयोग के लिए एक सख्त मानक सीमा है, यदि आप इसे मैन्युअल रूप से नहीं बढ़ाते हैं।

हमारे उत्पादों में से एक में हमने अपनी तैनाती स्क्रिप्ट में इस समाधान का पालन किया:

 node --max-old-space-size=4096 yourFile.js

एक नया स्पेस कमांड भी होगा, लेकिन जैसा कि मैंने यहां पढ़ा: एक टूर-ऑफ--वी-गारबेज-कलेक्शन नया स्पेस केवल नए बनाए गए शॉर्ट-टर्म डेटा को इकट्ठा करता है और पुराने स्पेस में सभी संदर्भित डेटा स्ट्रक्चर्स होते हैं, जो इसमें होने चाहिए। आपका मामला सबसे अच्छा विकल्प।


उसी तरह यह कॉन्फिगरेशन फ्रेम पर स्वतंत्र रूप से नोडज के लिए है। @ सिमर
फेलिक्स

मैं कोणीय 4 के साथ विकसित कर रहा हूं और एक ही मुद्दा प्राप्त कर रहा हूं, कोणीय एप्लिकेशन के लिए आपकी फाइल क्या होनी चाहिए।
विक्रम

@VikramSingh आप उपयोग कर रहे हैं ng serveया क्या आप ng buildएक्सप्रेस जैसे किसी अन्य वेबसर्वर द्वारा / डिस्ट फ़ोल्डर के परिणाम वितरित करते हैं ? लेकिन अगर आपकी कोणीय परियोजना मानक 1.7GB मेमोरी से अधिक उपयोग कर रही है, तो शायद आपके आवेदन में कोई वास्तु समस्या हो? ऐसा लगता है कि आप एनपीपी शुरू के साथ विकास एनवी का उपयोग कर रहे हैं शायद यह इसके लिए एक समाधान है github.com/mgechev/angular-seed/issues/2063
फेलिक्स

मैं एनजी बिल्ड का उपयोग कर रहा हूं कोणीय क्ली और एओटी (डिस्ट फ़ोल्डर) के साथ
विक्रम

2
index, js file @Techdive जिसे आप सर्वर शुरू करने के लिए उपयोग करते हैं
बासित

77

बस अगर कोई ऐसे वातावरण में चलता है, जहाँ वे नोड गुण सीधे सेट नहीं कर सकते हैं (मेरे मामले में एक बिल्ड टूल):

NODE_OPTIONS="--max-old-space-size=4096" node ...

यदि आप कमांड लाइन पर उन्हें पारित नहीं कर सकते हैं तो आप पर्यावरण चर का उपयोग करके नोड विकल्प सेट कर सकते हैं।


क्या आप यह समझा सकते हैं कि आपके कहने का मतलब क्या है, "... पर्यावरण चर का उपयोग करके नोड विकल्प सेट करें .."?
केसेलमे

6
@Keselme एक पर्यावरण चर एक चर है जिसे सर्वर पर सेट किया गया है जिससे सभी प्रक्रियाएं डेटा को पढ़ सकती हैं। अपने सर्वर पर एक SSH टर्मिनल खोलें और टाइप करें: MY_VAR = हैलो फिर टाइप करें: echo $ MY_VAR। आप देखेंगे कि यह टर्मिनल में "हैलो" प्रिंट करता है। आपने अभी एक पर्यावरण चर निर्धारित किया है और इसे वापस पढ़ें।
रॉब इवांस

उबंटू 18.04 पर काम किया, बस मेरे bashrc फ़ाइल में निर्यात कमांड जोड़ा
रहल कनिष्क

76

यदि आप विश्व स्तर पर नोड के मेमोरी उपयोग को बढ़ाना चाहते हैं - केवल एक स्क्रिप्ट नहीं, तो आप इस तरह पर्यावरण चर निर्यात कर सकते हैं:
export NODE_OPTIONS=--max_old_space_size=4096

तब आपको बिल्ड जैसे चलने पर फ़ाइलों के साथ खेलने की आवश्यकता नहीं है npm run build


1
एक अतिरिक्त सुविधा के रूप में, bash_profile या zsh प्रोफ़ाइल में जोड़ें।
ट्रॉपिकलएम्बलर

24

VSCode के साथ डीबग करने का प्रयास करते समय मुझे इस समस्या का सामना करना पड़ा, इसलिए बस यह जोड़ना चाहता था कि आप अपने डिबग सेटअप में तर्क कैसे जोड़ सकते हैं।

आप इसे runtimeArgsअपने कॉन्फ़िगरेशन की संपत्ति में जोड़ सकते हैं launch.json

नीचे उदाहरण देखें।

{
"version": "0.2.0",
"configurations": [{
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "${workspaceRoot}\\server.js"
    },
    {
        "type": "node",
        "request": "launch",
        "name": "Launch Training Script",
        "program": "${workspaceRoot}\\training-script.js",
        "runtimeArgs": [
            "--max-old-space-size=4096"
        ]
    }
]}

21

जब आप अपने नोड सर्वर को शुरू करते हैं तो अधिक मेमोरी की अनुमति देने के बारे में कुछ अतिरिक्त जानकारी जोड़ने के लिए कुछ ध्वज मान यहां दिए गए हैं।

1GB - 8GB

#increase to 1gb
node --max-old-space-size=1024 index.js

#increase to 2gb
node --max-old-space-size=2048 index.js 

#increase to 3gb
node --max-old-space-size=3072 index.js

#increase to 4gb
node --max-old-space-size=4096 index.js

#increase to 5gb
node --max-old-space-size=5120 index.js

#increase to 6gb
node --max-old-space-size=6144 index.js

#increase to 7gb
node --max-old-space-size=7168 index.js

#increase to 8gb 
node --max-old-space-size=8192 index.js 

क्या कोई इसे 2 की शक्तियों में बढ़ा सकता है? क्या इसे सिस्टम मेमोरी से बड़ा सेट करना चाहिए? यदि नहीं तो अधिकतम-पुराने-अंतरिक्ष-आकार अनुपात के लिए एक अच्छी प्रणाली मेमोरी क्या है?
हैरी मोरेनो

3
@HarryMoreno आप वास्तव में आप की तरह किसी भी संख्या मूल्य में डाल सकते हैं। 2 की शक्ति में नहीं है। हालांकि अनुपात के बारे में निश्चित नहीं है। यह केवल एक अधिकतम सीमा है, यह सभी मेमोरी का उपयोग नहीं करेगा। मैं बस इसे उतनी ही ऊँचाई पर सेट करूँगा जितना आपको जरूरत है, अगर जरूरत हो तो वापस।
निकोलस पोर्टर

मैं सिस्टम दे दूँगा RAM - 1gb एक कोशिश। इस vm को मान लेना केवल इस नोड ऐप को चलाने के लिए है।
हैरी मोरेनो

2
@HarryMoreno अधिकतम-पुराने-अंतरिक्ष-आकार अनुपात के लिए एक अच्छी प्रणाली मेमोरी पूरी तरह से इस बात पर निर्भर करती है कि आपकी मशीन पर और क्या चल रहा है। आप इसे दो की शक्तियों में बढ़ा सकते हैं - या आप किसी भी संख्या का उपयोग कर सकते हैं। आप इसे सिस्टम मेमोरी से बड़ा सेट कर सकते हैं - लेकिन आप स्वैप मुद्दों को हिट करेंगे।
गीगीमोई

20

मैं इसके साथ संघर्ष कर रहा था - सेटिंग-पुराने-अंतरिक्ष-आकार के बाद भी।

तब मुझे महसूस हुआ कि कर्म की पटकथा से पहले विकल्पों - मोम-पुराने-स्थान-आकार को रखना चाहिए।

दोनों वाक्यविन्यासों को निर्दिष्ट करने के लिए भी सबसे अच्छा - max-old-space-size और - max_old_space_size मेरी स्क्रिप्ट को कर्म के लिए:

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192  --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192   --prod --aot

संदर्भ https://github.com/angular/angular-cli/issues/1652


5
" दोनों वाक्यविन्यासों को निर्दिष्ट करने के लिए सबसे अच्छा --max-old-space-size और --max_old_space_size " - आपको ऐसा करने की आवश्यकता नहीं है, वे समानार्थक हैं। से nodejs.org/api/cli.html#cli_options : "(-) सभी विकल्प, वी 8 विकल्प सहित, शब्द दोनों डैश द्वारा अलग किए जाने की अनुमति या अंडरस्कोर (_)।"
ZachB

6
अधिकतम-निष्पादन योग्य-आकार को हटा दिया गया था और एक त्रुटि में समाप्त हो जाता है जब इसका उपयोग किया जाता है: github.com/nodejs/node/issues/13341
क्रैशबस

मुझे इसे काटना पड़ा --max-old-space-size=8192 --optimize-for-size --max_old_space_size=8192 --optimize_for_sizeऔर इसने काम किया
सेर्गेई प्लेशकोव

16

एओटी कोणीय निर्माण करते समय मेरे पास एक समान मुद्दा था। निम्नलिखित आदेशों ने मेरी मदद की।

npm install -g increase-memory-limit
increase-memory-limit

स्रोत: https://geeklearning.io/angular-aot-webpack-memory-trick/


1
चीयर्स ने मेरे लिए काम किया, यह आवश्यक हो सकता हैsudo npm -g install increase-memory-limit --unsafe-perm
सिंह

11

fwiw, मेमॉच जैसी किसी चीज़ के साथ मेमोरी हॉग को खोजने और ठीक करने में मदद मिल सकती है।


10

इस समस्या को हल करने के लिए चरण (विंडोज में) -

  1. कमांड प्रॉम्प्ट खोलें और %appdata%एंटर दबाएं
  2. पर जाए %appdata%> Npm फ़ोल्डर पर
  3. खोलें या संपादित करें ng.cmdअपने पसंदीदा संपादक को
  4. जोड़ना --max_old_space_size=8192IF और ELSE ब्लॉक में

आपकी node.cmdफ़ाइल परिवर्तन के बाद इस तरह दिखती है:

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)

यह विंडोज-विशिष्ट है। OP ने Windows के बारे में कुछ भी उल्लेख नहीं किया।
बजे डैन डस्केल्सस्कु

@DanDascalescu अपडेटेड उत्तर सूचित करने के लिए धन्यवाद
उमंग पटवा

6

निम्नलिखित पर्यावरण चर का उपयोग किया जा सकता है:

NODE_OPTIONS= --max-old-space-size=8192 .

एक और नोट: console.log() टर्मिनल में मेमोरी भी खपत करता है।

बस टर्मिनल पर कंसोल.लॉग () टिप्पणी करने की कोशिश की। क्योंकि वह भी स्मृति ले जाएगा।


6
यह एक उत्तर है या कुछ उत्तर के लिए टिप्पणी है? इसके साथ कई उत्तर हैंNODE_OPTIONS= --max-old-space-size=somesize
बार्बसन

5

यदि आप नोड (विंडोज़) के लिए विश्व स्तर पर मेमोरी बदलना चाहते हैं, तो उन्नत सिस्टम सेटिंग्स -> पर्यावरण चर -> नए उपयोगकर्ता चर पर जाएं

variable name = NODE_OPTIONS
variable value = --max-old-space-size=4096

4

मैंने have नीचे दिए गए कोड और उसके काम करने की कोशिश की है tried।

  • परियोजना रूट डीआईआर से खुला टर्मिनल
  • नए आकार सेट करने के लिए cmd निष्पादित करें।

    set NODE_OPTIONS=--max_old_space_size=8172

या आप अधिक जानकारी के लिए लिंक की जाँच कर सकते हैं https://github.com/nodejs/node/issues/10137#issuecomment-487255987


4

मैं बस कुछ सिस्टम में जोड़ना चाहता हूं, यहां तक ​​कि नोड मेमोरी लिमिट को बढ़ाना --max-old-space-size, यह पर्याप्त नहीं है और इस तरह एक ओएस त्रुटि है:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

इस मामले में, शायद इसलिए कि आप प्रति प्रक्रिया में अधिकतम मिमीप तक पहुंच गए।

आप चलकर max_map_count की जाँच कर सकते हैं

sysctl vm.max_map_count

और इसे बढ़ाकर

sysctl -w vm.max_map_count=655300

और इस लाइन को जोड़कर रिबूट के बाद रीसेट न करने के लिए इसे ठीक करें

vm.max_map_count=655300

में /etc/sysctl.confफ़ाइल।

अधिक जानकारी के लिए यहां देखें ।

त्रुटि का विश्लेषण करने के लिए एक अच्छा तरीका प्रक्रिया को चलाने के साथ है strace

strace node --max-old-space-size=128000 my_memory_consuming_process.js

3

मैंने हाल ही में इस समस्या का सामना किया है और इस थ्रेड में आया हूं, लेकिन मेरी समस्या Reactऐप के साथ थी । नोड स्टार्ट कमांड में परिवर्तन से मेरे मुद्दों का समाधान हुआ।

वाक्य - विन्यास

node --max-old-space-size=<size> path-to/fileName.js

उदाहरण

node --max-old-space-size=16000 scripts/build.js

अधिकतम-पुराने-अंतरिक्ष आकार में आकार 16000 क्यों है?

मूल रूप से, यह उस थ्रेड और आपकी नोड सेटिंग्स को आवंटित मेमोरी पर निर्भर करता है।

कैसे सत्यापित करें और सही आकार दें?

यह मूल रूप से हमारे इंजन में रहता है v8। नीचे दिए गए कोड से आपको अपने स्थानीय नोड v8 इंजन के हीप साइज़ को समझने में मदद मिलती है।

const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);

2

मैं अपने EC2 उदाहरण t2.micro के साथ एक ही समस्या का सामना कर रहा हूं जिसमें 1 जीबी मेमोरी है।

मैंने इस url का उपयोग करके स्वैप फ़ाइल बनाकर और पर्यावरण चर का पालन करके समस्या का समाधान किया ।

export NODE_OPTIONS=--max_old_space_size=4096

अंत में समस्या दूर हो गई है।

मुझे उम्मीद है कि यह भविष्य के लिए मददगार होगा।


1

यदि यह भारी लॉगिंग का उत्पादन करने वाले नोडज एप्लिकेशन का उपयोग करते समय बस इस मामले में लोगों की मदद कर सकता है, तो एक सहकर्मी ने मानक आउटपुट (ओं) को एक फ़ाइल में पाइप करके इस मुद्दे को हल किया।


1

यदि आप nodeस्वयं को लॉन्च करने की कोशिश नहीं कर रहे हैं , लेकिन कुछ अन्य नरम हैं, उदाहरण के लिए webpackआप पर्यावरण चर और cross-envपैकेज का उपयोग कर सकते हैं :

$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
  webpack --progress --config build/webpack.config.dev.js

1

कोणीय प्रोजेक्ट बंडलिंग के लिए, मैंने स्क्रिप्ट अनुभाग में अपनी pakage.json फ़ाइल में नीचे की रेखा जोड़ी है

"build-prod": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod --base-href /"

अब, अपने कोड को बंडल करने के लिए, मैं npm run build-prodइसके बजाय का उपयोग करता हूंng build --requiredFlagsHere

उम्मीद है की यह मदद करेगा!


0

नोड को नवीनतम संस्करण में अपग्रेड करें। मैं इस त्रुटि के साथ नोड 6.6 पर था और 8.9.4 में अपग्रेड किया गया और समस्या दूर हो गई।


0

मेरे मामले में मैं npm installनोड के पिछले संस्करण पर भागा था , कुछ दिन बाद मैंने नोड npm installमॉड्यूल और कुछ मॉड्यूल के लिए रैम को अपग्रेड किया । इसके बाद मुझे यह त्रुटि मिल रही थी। इस समस्या को ठीक करने के लिए मैंने प्रत्येक प्रोजेक्ट से नोड_मॉडल फ़ोल्डर को हटा दिया और चला गयाnpm install फिर से गया।

आशा है कि यह समस्या को ठीक कर सकता है।

नोट: यह मेरी लोकल मशीन पर हो रहा था और यह लोकल मशीन पर ही फिक्स हो गया।


0

यह कमांड पूरी तरह से काम करता है। मेरे लैपटॉप में 8 जीबी रैम है, इसलिए मैंने आकार = 8192 सेट किया। यह सब राम के बारे में है और आपको सेट फ़ाइल नाम भी चाहिए। मैं npm रन बिल्ड कमांड चलाता हूं, इसलिए मैंने build.js का उपयोग किया है ।

node --expose-gc --max-old-space-size=8192 node_modules/react-scripts/scripts/build.js

0

मेरे मामले में, मैंने नोड.जेएस संस्करण को नवीनतम में उन्नत किया और यह एक आकर्षण की तरह काम किया।


नमस्ते एंजेला और एसओ में आपका स्वागत है! क्या आप शायद भविष्य के पाठकों के लिए अपडेट किए गए Node.js के सटीक संस्करण को निर्दिष्ट कर सकते हैं? धन्यवाद!
kant312

मैंने नवीनतम LTS संस्करण में अपग्रेड किया: 12.18.0
एंजेला राणा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.