prisma: Get `JavaScript heap out of memory` error when pushing a bulk date with `createMany`.

Bug description

I’m working on migrating data form mariaDB to postgreSQL.

When I try to push a bulk data with createMany, I got error message like below. The ballpark data size I’v tried is about 252mb.

<--- Last few GCs --->

[94783:0x120008000]   645373 ms: Scavenge 4031.5 (4114.0) -> 4029.3 (4117.5) MB, 6.5 / 0.0 ms  (average mu = 0.874, current mu = 0.271) allocation failure
[94783:0x120008000]   645387 ms: Scavenge 4034.7 (4117.5) -> 4032.1 (4135.5) MB, 7.2 / 0.0 ms  (average mu = 0.874, current mu = 0.271) allocation failure
[94783:0x120008000]   646371 ms: Mark-sweep 4044.7 (4135.5) -> 4038.1 (4145.2) MB, 967.5 / 0.0 ms  (average mu = 0.814, current mu = 0.109) allocation failure scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
 1: 0x10476c668 node::Abort() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 2: 0x10476c7e8 node::errors::TryCatchScope::~TryCatchScope() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 3: 0x1048b77e8 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 4: 0x1048b777c v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 5: 0x104a4a214 v8::internal::Heap::CollectionBarrier::ShutdownRequested() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 6: 0x104a9bc6c v8::internal::EvacuateNewSpaceVisitor::Visit(v8::internal::HeapObject, int) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 7: 0x104a85214 void v8::internal::LiveObjectVisitor::VisitBlackObjectsNoFail<v8::internal::EvacuateNewSpaceVisitor, v8::internal::MajorNonAtomicMarkingState>(v8::internal::MemoryChunk*, v8::internal::MajorNonAtomicMarkingState*, v8::internal::EvacuateNewSpaceVisitor*, v8::internal::LiveObjectVisitor::IterationMode) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 8: 0x104a84e6c v8::internal::FullEvacuator::RawEvacuatePage(v8::internal::MemoryChunk*, long*) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
 9: 0x104a84b70 v8::internal::Evacuator::EvacuatePage(v8::internal::MemoryChunk*) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
10: 0x104a9fcf0 v8::internal::PageEvacuationTask::RunInParallel(v8::internal::ItemParallelJob::Task::Runner) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
11: 0x104a5ffbc v8::internal::ItemParallelJob::Task::RunInternal() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
12: 0x104a6038c v8::internal::ItemParallelJob::Run() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
13: 0x104a8693c void v8::internal::MarkCompactCollectorBase::CreateAndExecuteEvacuationTasks<v8::internal::FullEvacuator, v8::internal::MarkCompactCollector>(v8::internal::MarkCompactCollector*, v8::internal::ItemParallelJob*, v8::internal::MigrationObserver*, long) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
14: 0x104a864e4 v8::internal::MarkCompactCollector::EvacuatePagesInParallel() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
15: 0x104a736b4 v8::internal::MarkCompactCollector::Evacuate() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
16: 0x104a71478 v8::internal::MarkCompactCollector::CollectGarbage() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
17: 0x104a4a878 v8::internal::Heap::MarkCompact() [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
18: 0x104a48154 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
19: 0x104a461f0 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
20: 0x104a524b8 v8::internal::Heap::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
21: 0x104a52548 v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
22: 0x104a2588c v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
23: 0x104d42038 v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
24: 0x1050321cc Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
25: 0x1050331fc Builtins_StringAdd_CheckNone [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
26: 0x10508d000 Builtins_RegExpReplace [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
27: 0x1050232b0 Builtins_StringPrototypeReplace [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
28: 0x203a5e9f1fc
29: 0x10504ea24 Builtins_ArrayMap [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
30: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
31: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
32: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
33: 0x104fc2504 Builtins_ArgumentsAdaptorTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
34: 0x10504ea24 Builtins_ArrayMap [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
35: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
36: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
37: 0x1050650a0 Builtins_OrdinaryToPrimitive_String [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
38: 0x105064df0 Builtins_NonPrimitiveToPrimitive_String [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
39: 0x10505e4b4 Builtins_ToString [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
40: 0x105060a0c Builtins_StringConstructor [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
41: 0x10504ea24 Builtins_ArrayMap [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
42: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
43: 0x1050650a0 Builtins_OrdinaryToPrimitive_String [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
44: 0x105064df0 Builtins_NonPrimitiveToPrimitive_String [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
45: 0x10505e4b4 Builtins_ToString [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
46: 0x105060a0c Builtins_StringConstructor [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
47: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
48: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
49: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
50: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
51: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
52: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
53: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
54: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
55: 0x104fc2504 Builtins_ArgumentsAdaptorTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
56: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
57: 0x104fcaed4 Builtins_InterpreterEntryTrampoline [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
58: 0x10507fc4c Builtins_PromiseResolveThenableJob [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
59: 0x104fea274 Builtins_RunMicrotasks [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
60: 0x104fc8668 Builtins_JSRunMicrotasksEntry [/Users/dean/.nvm/versions/node/v15.9.0/bin/node]
61: 0x120008000
error Command failed with signal "SIGABRT".

How to reproduce

Expected behavior

pushing data without error.

Prisma information

Try to push data to below model.

generator client {
  provider = "prisma-client-js"
  output   = "../src/generated/client-new"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Artwork {
  id                             String    @id @default(cuid()) @db.VarChar(50)
  productionFromYear             String?   @db.VarChar(4)
  productionToYear               String?   @db.VarChar(4)
  korName                        String?   @db.VarChar(700)
  engName                        String?   @db.VarChar(700)
  meterial                       String?   @db.Text
  dimension                      String?   @db.Text
  heightType                     String?   @db.VarChar(50)
  heightCm                       Decimal?  @db.Decimal(7, 3)
  widthCm                        Decimal?  @db.Decimal(7, 3)
  depthCm                        Decimal?  @db.Decimal(7, 3)
  diameterCm                     Decimal?  @db.Decimal(7, 3)
  heightInch                     Decimal?  @db.Decimal(7, 3)
  widthInch                      Decimal?  @db.Decimal(7, 3)
  depthInch                      Decimal?  @db.Decimal(7, 3)
  diameterInch                   Decimal?  @db.Decimal(7, 3)
  desc                           String?
  modifierId                     String?   @db.VarChar(50)
  registId                       String?   @db.VarChar(50)
  locationLat                    Decimal?  @db.Decimal(15, 12)
  locationLon                    Decimal?  @db.Decimal(15, 12)
  estimatedPriceCurrency         String?   @db.VarChar(50)
  highEstimatedPrice             Decimal?  @db.Decimal(20, 5)
  lowEstimatedPrice              Decimal?  @db.Decimal(20, 5)
  estimatedPriceUSD              Decimal?  @db.Decimal(20, 5)
  estimatedPriceRegistDate       DateTime?
  signiture                      String?   @db.VarChar(1000)
  location                       String?   @db.VarChar(200)
  publicSalesRecordState         String?   @default("100") @db.VarChar(50)
  publicSalesRecordPriceCurrency String?   @default("100") @db.VarChar(50)
  publicSalesRecordPrice         Decimal?  @db.Decimal(20, 5)
  publicSalesRecordDate          DateTime?
  hashtag                        String?   @db.VarChar(1000)
  repColor1                      String?   @db.VarChar(50)
  repColor2                      String?   @db.VarChar(50)
  repColor3                      String?   @db.VarChar(50)
  introUrl                       String?   @db.VarChar(255)
  sizeType                       String?   @db.VarChar(50)

  createdAt DateTime? @default(now())
  updatedAt DateTime? @default(now()) @updatedAt
  deletedAt DateTime?

  artistId String? @db.VarChar(50)
  artist   Artist? @relation(fields: [artistId], references: [id])

  essays   Essay[]
  comments Comment[]
  likes    Like[]
}

Environment & setup

  • OS: Mac OS silicon(M1) Bigsur
  • Database: PostgreSQL
  • Node.js version: 15.9

Prisma Version

2.27

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 1
  • Comments: 16 (8 by maintainers)

Commits related to this issue

Most upvoted comments

There are some improvements to memory consumption on the large queries. Re-running @mehdi-sp example, on 4.16.2 heap grows by 1977 MB after insert, where on 5.0.0 it grows by 555 MB. In both cases, excess memory is succesfully reclaimed by GC.

Hi @janpio

Do you have a concrete problem @jcbfonseca that is triggered by this? Additional information can always change the priority.

Yes. I will try to explain below…

We have an application which imports 10 excel files, make some validations in their records e insert into a postgres db through prisma library.

We note that a process RSS memory increases and HEAP memory not. We use createMany() .

According to @mehdi-sp @kaykhancheckpoint (https://github.com/prisma/prisma/issues/8500#issuecomment-1040285909) we made any test: 1- prisma createMany or queryRaw show memory leak issue (createMany high, queryRaw medium). 2- When we remove prisma and use other library (pg - https://node-postgres.com/ ) the memory leak disappears.

Bellow results of some tests executed based on @mehdi-sp repo (https://github.com/mehdi-sp/prisma-createmany-outofmemory):

Prisma CreateMany RSS vs. Heap memory Prisma_CreateMany

Prisma QueryRaw RSS vs. Heap memory Prisma_QueryRaw

No Prisma use (PG library - https://node-postgres.com/) NoPrisma_PGLibrary

@janpio Recently we had the same problem while inserting ~1M rows using createMany. from my observations it uses at least 3 times more memory than the size of its input. image the purple bar on the right of the picture is the input array(~400MB) and the green one on the left is the memory used by prisma client (~1400MB) before the crash. https://github.com/mehdi-sp/prisma-createmany-outofmemory

@janpio I finished off that job last year. So I don’t have a data anymore. I’m sorry that I can’t help you.