我在 MongoDB 中有一個“注釋”集合,其中包含 500 萬個檔案。集合大小幾乎為 2.5 GB,其索引大小為 55 MB。
我試圖將集合存盤在一個變數中
const Annotation = await database.collection("annotations").find().toArray();
但是每當我嘗試運行該應用程式時,它都會因給出此錯誤而崩潰。
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 00007FF6351E7C4F v8::internal::CodeObjectRegistry::~CodeObjectRegistry 114207
2: 00007FF635175EC6 DSA_meth_get_flags 65542
3: 00007FF635176D7D node::OnFatalError 301
4: 00007FF635AAB6CE v8::Isolate::ReportExternalAllocationLimitReached 94
5: 00007FF635A95CAD v8::SharedArrayBuffer::Externalize 781
6: 00007FF63593907C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode 1468
7: 00007FF635945D29 v8::internal::Heap::PublishPendingAllocations 1129
8: 00007FF635942CFA v8::internal::Heap::PageFlagsAreConsistent 2842
9: 00007FF635935959 v8::internal::Heap::CollectGarbage 2137
10: 00007FF63593E21B v8::internal::Heap::GlobalSizeOfObjects 33111: 00007FF63598498B v8::internal::StackGuard::HandleInterrupts 891
12: 00007FF63568C3C6 v8::internal::DateCache::Weekday 803813: 00007FF635B393C1 v8::internal::SetupIsolateDelegate::SetupHeap 494417
14: 000001F1E83C5EC9
我試圖通過使用這個命令來修復它,但它仍然給我這個錯誤。
$env:NODE_OPTIONS=--max-old-space-size=8192
有人可以建議我如何在我的應用程式中輕松管理如此大量的資料集嗎?
uj5u.com熱心網友回復:
在你的位置,我會問自己是否真的需要立即獲取所有這些資料并存盤在記憶體中。
如果您要以某種方式處理它,一次可能只有某些欄位有用,因此您可以僅投影這些欄位,或者在資料庫本身中進行處理/分析,因為它通常會快得多,因為資料不需要移動從它到你的變數。
uj5u.com熱心網友回復:
處理大量資料的最佳方法是將其作為流處理,因此您無需一次將整個資料集加載到記憶體中。你可以嘗試這樣的事情:
const cursor = database.collection("annotations").find();
for await (const annotation of cursor) {
// do something with the annotation
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514758.html
