I dag kørte jeg mit script til indeksering af filsystemer for at opdatere RAID-filindekset, og efter 4 timer styrtede det ned med følgende fejl:
[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
Serveren er udstyret med 16gb RAM og 24gb SSD swap. Jeg tvivler stærkt på, at mit script overskred 36gb hukommelse. I det mindste burde det ikke
Scriptet opretter indeks af filer gemt som Array of Objects med filmetadata (ændringsdatoer, tilladelser osv., ingen store data)
Her's fuld scriptkode: http://pastebin.com/mjaD76c3
I've allerede experiend underlige node problemer i fortiden med dette script, hvad tvang mig f.eks. split index i flere filer som node var glitching når man arbejder på så store filer som String. Er der nogen måde at forbedre nodejs hukommelseshåndtering med store datasæt?
Hvis jeg husker rigtigt, er der en streng standardgrænse for hukommelsesforbruget i V8 på omkring 1,7 GB, hvis du ikke øger den manuelt.
I et af vores produkter fulgte vi denne løsning i vores deploy-script:
node --max-old-space-size=4096 yourFile.js
Der ville også være en ny rumkommando, men som jeg læste her: a-tour-of-v8-garbage-collection det nye rum samler kun de nyoprettede kortvarige data, og det gamle rum indeholder alle refererede datastrukturer, hvilket i dit tilfælde skulle være den bedste løsning.
Jeg stødte på dette problem, da jeg forsøgte at debugge med VSCode, så jeg ville bare tilføje, at du kan tilføje argumentet til din debug-opsætning på denne måde.
Du kan tilføje det til egenskaben runtimeArgs
i din config i launch.json
.
Se eksemplet nedenfor.
{
"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"
]
}
]}
jeg kæmpede med dette, selv efter at have indstillet --max-old-space-size.
Så jeg indså, at jeg skulle sætte indstillinger --max-old-space-size før karma-scriptet.
også bedst at angive begge syntakser --max-old-space-size og --max_old_space_size mit script for karma :
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
reference https://github.com/angular/angular-cli/issues/1652