Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新计数器时Cassandra Node.js驱动程序内存泄漏_Javascript_Node.js_Cassandra_Cql_Cassandra Driver - Fatal编程技术网

Javascript 更新计数器时Cassandra Node.js驱动程序内存泄漏

Javascript 更新计数器时Cassandra Node.js驱动程序内存泄漏,javascript,node.js,cassandra,cql,cassandra-driver,Javascript,Node.js,Cassandra,Cql,Cassandra Driver,正在尝试迁移计数器表。读取源表中的每一行并将结果写入新表。当写入数以百万计的行时,js的问题是堆内存不足。同步代码用于确保在尝试写入另一行之前先写入该行。在使用cassandra驱动程序执行UPDATE查询时,如果要解决观察堆的问题,堆似乎会上升 const query = `UPDATE keyspace.table_name SET counter1 = counter1 + ${x1}, counter2 = counter2 + ${x2} WHERE partition_key

正在尝试迁移计数器表。读取源表中的每一行并将结果写入新表。当写入数以百万计的行时,js的问题是堆内存不足。同步代码用于确保在尝试写入另一行之前先写入该行。在使用
cassandra驱动程序执行
UPDATE
查询时,如果要解决观察堆的问题,堆似乎会上升

const query = `UPDATE keyspace.table_name
  SET counter1 = counter1 + ${x1}, counter2 = counter2 + ${x2}
  WHERE partition_key = ? AND clustering_key = ?`;

await cassandraDestination.execute(query, params, { prepare: true });
在这种情况下如何避免内存泄漏


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

    0: ExitFrame [pc: 0x1317672cfc5d]
Security context: 0x192500f1d971 <JSObject>
    1: borrowNextConnection [0x2ea411f96091] [/home/asen.chekov/projects/stats/node_modules/cassandra-driver/lib/request-handler.js:~64] [pc=0x131767db1395](this=0x2ea411f95da1 <JSFunction RequestHandler (sfi = 0x2e8feb1ef231)>,0x21125933f379 <Object map = 0x1ddd59acbdb1>,0x21125933f439 <Object map = 0x1ddd59a82521>,0x110a33490991 <ProfileManager map...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

Writing Node.js report to file: report.20191016.122316.23174.001.json
Node.js report completed
 1: 0x953b10 node::Abort() [node]
 2: 0x9547f4 node::OnFatalError(char const*, char const*) [node]
 3: 0xb32bee v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
 4: 0xb32e24 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
 5: 0xf32452  [node]
 6: 0xf32558 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [node]
 7: 0xf3ec78 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
 8: 0xf3f78b v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
 9: 0xf424c1 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node]
10: 0xf0c6f4 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node]
11: 0x11c2b3e v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node]
12: 0x1317672cfc5d 
Aborted (core dumped)```

==JS堆栈跟踪=========================================
0:ExitFrame[pc:0x1317672cfc5d]
安全上下文:0x192500f1d971

1:BrooknextConnection[0x2ea411f96091][home/asen.chekov/projects/stats/node_modules/cassandra driver/lib/request handler.js:~64][pc=0x131767db1395](this=0x2ea411f95da1,0x21125933f379,0x21125933f439,0x110a33490991注意
execute()的方法签名是:

execute(query: string, params: Array, options: object)
此外,不应在中硬编码参数

正确的用法是:

const query = `UPDATE keyspace.table_name
  SET counter = counter + 1, counter1 = counter1 + 1
  WHERE partition_key = ? AND clustering_key = ?`;

await cassandraDestination.execute(query, [ key1, key2 ], { prepare: true });

这解决了问题

正确的查询是:

const query = `UPDATE keyspace.table_name
  SET counter1 = counter1 + ?, counter2 = counter2 + ?
  WHERE partition_key = ? AND clustering_key = ?`;

await cassandraDestination
  .execute(query, [ counter1, counter2, key1, key2 ], {
    prepare: true,
  });

是的,在本例中,查询是错误的,但为了简化问题,我对其进行了修改。问题在于该execute语句的内存泄漏导致堆内存不断增加。使用查询标记而不是硬编码参数,准备好的语句将被缓存。如果使用硬编码参数,则将缓存一条准备语句r不同的参数。我在原始代码中使用了查询标记,这不是问题。请更新代码示例并尝试包含代码的其余部分,否则将很难理解它是如何发生的。我也在对查询中的计数器值进行硬编码。您通过要求检查查询和我想为什么不将计数器值也添加到params数组中。现在堆的大小保持在55MB左右。无论如何,谢谢。