有没有一种方法可以优化此Promise循环,以使我不再出现致命的JavaScript堆内存不足错误?

Notacorn

我已经调用了最大为2048(mb?)的节点,但没有成功,因此,在这一点上,我认为继续提高内存限制是没有道理的,尤其是当我的代码效率低下时。这是致命错误的答案:接近堆限制的无效标记压缩分配失败-尽管ionic 3中的JavaScript堆内存不足

参考: node --max-old-space-size=2048

为简洁起见:

<--- Last few GCs --->
io[5481:0x5693440]   286694 ms: Mark-sweep 2048.0 (2051.1) -> 2047.3 (2051.3) MB, 1268.3 / 0.0 ms  (+ 0.0 ms in 13 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 1272 ms) (average mu = 0.087, current mu = 0.003) allocatio[5481:0x
5693440]   290098 ms: Mark-sweep 2048.2 (2051.3) -> 2047.5 (2051.3) MB, 3398.6 / 0.0 ms  (+ 0.0 ms in 13 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 3404 ms) (average mu = 0.026, current mu = 0.002) allocatio

<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0xa2b020 node::Abort() [node]
 2: 0x97a467 node::FatalError(char const*, char const*) [node]
 3: 0xb9e0ee v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
 4: 0xb9e467 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
 5: 0xd3e875  [node]
 6: 0xd3f21b v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [node]
 7: 0xd4d012 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
 8: 0xd4de65 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
 9: 0xd5082c v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node]
10: 0xd1fecb v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node]
11: 0x10501ef v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node]
12: 0x13a9ed9  [node]
Aborted
npm ERR! code ELIFECYCLE

这是我有问题的功能:

    public async upsertToDb(courses: Record<string, Record<string, any>>): Promise<string> {
        this.courseTransformationUtility.transformToFlatStructure(courses);
        const flatCourses: Array<Course> = this.courseTransformationUtility.getFlatCourses();
        const flatClasses: Array<Class> = this.courseTransformationUtility.getFlatClasses();

        console.info(`Courses exploded into ${flatCourses.length} rows.`)
        console.info(`Classes exploded into ${flatClasses.length} rows.`)

        await this._deleteTable("Course");
        await this._deleteTable("Class");

        for(let i = 0; i < flatCourses.length; i+=100) {
            Backendless.Data.of(Course).bulkCreate(flatCourses.slice(i, i + 100))
                .then(() => {
                    process.stdout.write(".");
                })
                .catch((e: Error) => console.info(e));
        }


        for(let i = 0; flatClasses.length; i+=100) {
            Backendless.Data.of(Class).bulkCreate(flatClasses.slice(i, i + 100))
                .then(() => {
                    process.stdout.write(".");
                })
                .catch((e: Error) => console.info(e));
        }

        return "";
    }

如果我注释掉,第二个循环节点将在默认内存设置上运行此命令,而不会出现任何问题。如果我不得不猜测这个问题与异步有关,但是我真的不确定。如果这是问题所在,我们可以完全取消同步吗?抱歉,这里有很多问题我没有深度回答。

编辑:代码更新

Promise.all不是解决方案,至少就我而言。

        for(let i = 0; i < flatCourses.length; i+=100) {
            let promise: Promise<Array<string>> = Backendless.Data.of(Course).bulkCreate(flatCourses.slice(i, i + 100));
            promise.then(() => process.stdout.write('.'));
            coursePromises.push(promise);
        }

        await Promise.all(coursePromises.slice(0, Math.floor(coursePromises.length/2))).then(() => console.info("1/4"));
        await Promise.all(coursePromises.slice(Math.floor(coursePromises.length/2))).then(() => console.info("2/4"));

        for(let i = 0; flatClasses.length; i+=100) {
            let promise: Promise<Array<string>> = Backendless.Data.of(Class).bulkCreate(flatClasses.slice(i, i + 100));
            promise.then(() => process.stdout.write('.'));
            classPromises.push(promise);
        }

        await Promise.all(classPromises.slice(0, Math.floor(classPromises.length/2))).then(() => console.info("3/4"));
        await Promise.all(classPromises.slice(Math.floor(classPromises.length/2))).then(() => console.info("4/4"));

测井

Using term 202008...
Publishing 2113 courses...
Courses exploded into 11630 rows.
Classes exploded into 10986 rows.
....................................................................................................................1/4
.2/4

<--- Last few GCs --->
io[5628:0x5a47390]   310095 ms: Mark-sweep 2047.4 (2050.7) -> 2046.7 (2051.0) MB, 1935.6 / 0.0 ms  (+ 0.0 ms in 14 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 1941 ms) (average mu = 0.117, current mu = 0.003) allocatio[5628:0x
5a47390]   311960 ms: Mark-sweep 2047.6 (2051.0) -> 2046.9 (2051.2) MB, 1860.4 / 0.0 ms  (+ 0.0 ms in 13 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 1865 ms) (average mu = 0.063, current mu = 0.003) allocatio

<--- JS stacktrace --->
关颖

您可以一次执行一次所有异步操作,或者一次执行一次课程和课程。

一次一次完成所有操作。

for (let i = 0; i < flatCourses.length; i+=100) {
    try {
        await Backendless.Data.of(Course).bulkCreate(flatCourses.slice(i, i + 100))
        process.stdout.write(".");
    } catch (e) {
        console.info(e)
    }
}
// Do the same for flatClasses

一次课程和一堂课

const promises = []

for (let i = 0; i < flatCourses.length; i+=100) {
    const promise = Backendless.Data.of(Course).bulkCreate(flatCourses.slice(i, i + 100))
    promise.then(() => {
        process.stdout.write(".");
    })
    .catch((e: Error) => console.info(e));

    promises.push(promise)
}

await Promise.all(promises)
// Do the same for flatClasses

更复杂的方法涉及一次执行N次操作,但是如果这些简单的方法解决了您的问题,我走的不会太远。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以使代码分析忽略“ InternalsVisibleTo”?

来自分类Dev

有没有一种方法可以使SQL日志使用CloudSQL查看/优化我的查询

来自分类Dev

有没有一种方法可以使用JavaScript发送CoAP命令?

来自分类Dev

有没有一种方法可以阻止JavaScript在我的网站上运行?

来自分类Dev

有没有一种方法可以使表演不结束(例如无限的while循环)?

来自分类Dev

有没有一种方法可以优化我的bigquery sql以使其运行更快?

来自分类Dev

有没有一种方法可以优化Spark sql代码?

来自分类Dev

有没有一种方法可以优化此DP程序中的空间?

来自分类Dev

有没有一种方法可以使用Sass缩短此CSS?

来自分类Dev

有没有一种方法可以使OpenCL C ++绑定对所有错误抛出异常?

来自分类Dev

有没有一种方法可以优化此Gremlin查询?

来自分类Dev

有没有一种方法可以使用javascript阻止javascript?

来自分类Dev

有没有一种方法可以优化此查询

来自分类Dev

有没有一种方法可以使序列号字符串不使用for循环?

来自分类Dev

有没有一种方法可以使此函数计算sd和均值?

来自分类Dev

有没有一种方法可以使用循环对多个图像执行onclick功能?

来自分类Dev

有没有一种方法可以使用websoket重载Node.js事件循环

来自分类Dev

有没有一种方法可以使此单击按钮在true / false之间交替显示?

来自分类Dev

有没有一种方法可以简化Python中的“循环” /“循环”交互?

来自分类Dev

有没有一种方法可以使for循环沿列表的元素重复?

来自分类Dev

有没有一种方法可以通过使用.forEach或.map代替for循环来解决此问题?

来自分类Dev

有没有一种方法可以使python针对错误的输入文本返回错误?

来自分类Dev

有没有一种方法可以获取所有堆userptr的userstack

来自分类Dev

有没有一种方法可以在php中优化此mysql代码?

来自分类Dev

有没有一种方法可以使用此命令而不必一直输入“ y”?

来自分类Dev

在bash中,有没有一种方法可以使我的语句简短(if或)?

来自分类Dev

有没有一种方法可以使Google搜索API仅搜索我的应用程序?

来自分类Dev

有没有一种方法可以使bash for循环并行化?

来自分类Dev

有没有一种方法可以形成此正则表达式,以使可选组不会出现在匹配组中?

Related 相关文章

  1. 1

    有没有一种方法可以使代码分析忽略“ InternalsVisibleTo”?

  2. 2

    有没有一种方法可以使SQL日志使用CloudSQL查看/优化我的查询

  3. 3

    有没有一种方法可以使用JavaScript发送CoAP命令?

  4. 4

    有没有一种方法可以阻止JavaScript在我的网站上运行?

  5. 5

    有没有一种方法可以使表演不结束(例如无限的while循环)?

  6. 6

    有没有一种方法可以优化我的bigquery sql以使其运行更快?

  7. 7

    有没有一种方法可以优化Spark sql代码?

  8. 8

    有没有一种方法可以优化此DP程序中的空间?

  9. 9

    有没有一种方法可以使用Sass缩短此CSS?

  10. 10

    有没有一种方法可以使OpenCL C ++绑定对所有错误抛出异常?

  11. 11

    有没有一种方法可以优化此Gremlin查询?

  12. 12

    有没有一种方法可以使用javascript阻止javascript?

  13. 13

    有没有一种方法可以优化此查询

  14. 14

    有没有一种方法可以使序列号字符串不使用for循环?

  15. 15

    有没有一种方法可以使此函数计算sd和均值?

  16. 16

    有没有一种方法可以使用循环对多个图像执行onclick功能?

  17. 17

    有没有一种方法可以使用websoket重载Node.js事件循环

  18. 18

    有没有一种方法可以使此单击按钮在true / false之间交替显示?

  19. 19

    有没有一种方法可以简化Python中的“循环” /“循环”交互?

  20. 20

    有没有一种方法可以使for循环沿列表的元素重复?

  21. 21

    有没有一种方法可以通过使用.forEach或.map代替for循环来解决此问题?

  22. 22

    有没有一种方法可以使python针对错误的输入文本返回错误?

  23. 23

    有没有一种方法可以获取所有堆userptr的userstack

  24. 24

    有没有一种方法可以在php中优化此mysql代码?

  25. 25

    有没有一种方法可以使用此命令而不必一直输入“ y”?

  26. 26

    在bash中,有没有一种方法可以使我的语句简短(if或)?

  27. 27

    有没有一种方法可以使Google搜索API仅搜索我的应用程序?

  28. 28

    有没有一种方法可以使bash for循环并行化?

  29. 29

    有没有一种方法可以形成此正则表达式,以使可选组不会出现在匹配组中?

热门标签

归档