Câu hỏi Node.js đã hết bộ nhớ


Hôm nay tôi chạy tập lệnh của tôi để lập chỉ mục hệ thống tập tin để làm mới chỉ mục các tệp RAID và sau 4h nó bị lỗi với lỗi sau:

[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

Máy chủ được trang bị RAM 16 GB và trao đổi SSD 24 GB. Tôi rất nghi ngờ kịch bản của tôi vượt quá 36GB bộ nhớ. Ít nhất nó không nên

Script tạo chỉ mục các tệp được lưu trữ dưới dạng Mảng đối tượng có siêu dữ liệu tệp (ngày sửa đổi, quyền, v.v., không có dữ liệu lớn)

Đây là mã script đầy đủ: http://pastebin.com/mjaD76c3

Tôi đã thử nghiệm các vấn đề nút lạ trong quá khứ với kịch bản này, những gì buộc tôi ví dụ. chia nhỏ chỉ mục thành nhiều tệp khi nút bị trục trặc khi làm việc trên các tệp lớn như Chuỗi. Có cách nào để cải thiện quản lý bộ nhớ nodejs với bộ dữ liệu khổng lồ?


76
2017-07-25 02:45


gốc




Các câu trả lời:


Nếu tôi nhớ chính xác, có một giới hạn tiêu chuẩn nghiêm ngặt cho việc sử dụng bộ nhớ trong V8 khoảng 1,7 GB, nếu bạn không tăng nó theo cách thủ công.

Trong một trong các sản phẩm của chúng tôi, chúng tôi đã làm theo giải pháp này trong kịch bản triển khai của chúng tôi:

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

Cũng sẽ có một lệnh không gian mới nhưng như tôi đã đọc ở đây: a-tour-of-v8-garbage-collection không gian mới chỉ thu thập dữ liệu ngắn hạn mới được tạo và không gian cũ chứa tất cả các cấu trúc dữ liệu được tham chiếu nên trong trường hợp của bạn là tùy chọn tốt nhất.


110
2017-07-25 05:29



làm thế nào để thiết lập này trên toàn cầu? - aufula
Bạn không thể @aufula - Christophe Geers
Nơi để thiết lập này nếu tôi đang sử dụng Express framework? - Simer
Trong cùng một cách cấu hình này là dành cho nodejs độc lập trên khuôn khổ. - Felix
Tôi đang phát triển với góc 4 và nhận được cùng một vấn đề, những gì nên được yourFile.js tập tin cho các ứng dụng góc? - Vikram Singh


Tôi gặp phải vấn đề này khi cố gắng để gỡ lỗi với VSCode, vì vậy chỉ muốn thêm này là làm thế nào bạn có thể thêm các đối số để thiết lập gỡ lỗi của bạn.

Bạn có thể thêm nó vào runtimeArgs thuộc tính của cấu hình của bạn trong launch.json.

Xem ví dụ bên dưới.

{
"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"
        ]
    }
]}

13
2018-06-20 01:26





tôi đã đấu tranh với điều này ngay cả sau khi thiết lập -max-old-space-size.

Sau đó, tôi nhận ra cần phải đặt tùy chọn - max-old-không gian-kích thước trước khi kịch bản nghiệp.

cũng tốt nhất để chỉ định cả hai cú pháp - max-old-space-size và --max_old_space_size kịch bản của tôi cho nghiệp:

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

tài liệu tham khảo https://github.com/angular/angular-cli/issues/1652


4
2018-06-22 08:43





fwiw, tìm và sửa chữa một con heo nhớ với một cái gì đó như đồng hồ có thể giúp.


4
2018-06-30 16:00





Nâng cấp nút lên phiên bản mới nhất. Tôi đã ở trên nút 6.6 với lỗi này và nâng cấp lên 8.9.4 và sự cố đã biến mất.


3
2018-01-12 07:01





Chỉ trong trường hợp nó có thể giúp mọi người gặp vấn đề này trong khi sử dụng các ứng dụng nodejs sản xuất khai thác gỗ nặng, một đồng nghiệp đã giải quyết vấn đề này bằng cách tạo đầu ra tiêu chuẩn cho một tệp.


1
2018-04-04 08:39





Tôi đã có một vấn đề tương tự trong khi làm AOT góc xây dựng. Các lệnh sau đã giúp tôi.

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

Nguồn: https://geeklearning.io/angular-aot-webpack-memory-trick/


0
2017-07-31 11:52