一个有趣的爬虫经历:在 Nodejs v8.4.0 环境下,处理 4w+数据写入 excel 两天未成功,望大佬们答疑解惑

发布于 1周前 作者 nodeper 来自 nodejs/Nestjs

一个有趣的爬虫经历:在 Nodejs v8.4.0 环境下,处理 4w+数据写入 excel 两天未成功,望大佬们答疑解惑

各位 V 友们,第一次发帖,有个关于 nodejs 的问题请教下,具体记录在这篇帖子里: Issues-记录一次有趣的爬虫经历

简单来讲,就是 nodejs v8 下一下子处理 4w+数据写入 excel 两天都没好。。。

写入 excel 用的是 xlsx 这个库,自己写的处理函数主要用到 map 和 Object.assign,就是将数据格式化,再用 xlsx 处理。

之前的 9k 多数据几个小时就好,数据量更小的话几分钟也能好,所以排除代码的问题。

这个情况有点纠结啊,是不是 nodejs 下一次处理 4w+数据有问题? ==


11 回复

你居然等了两天???


先写 csv 再想办法转吧

对…挂在电脑上跑了两天都没有好…

当时也没考虑很多,直接用了 xlxs 库,数据小可以用,数据大了就 gg。就想知道这背后发生了什么(゚ o ゚;;

首先处理大量数据可以考虑分段,或者流的形式处理。

嗯嗯,现在看来得做一下修改了🤣

或者拆分成多个子进程处理,这样哪一段数据有问题也更容易定位。看人家也有提 issue 说处理大量数据会有各种问题。其实用其他语言像 java 处理也不是很难,感觉会跟合适一点,有成熟的库,搭个本地服务器处理一下就好。

嗯嗯,这几天赶工期准备先减少数据量把数据搞完再说,之后再好好研究下爬虫数据处理的问题。感谢老哥的建议👀

Object.assign 不要用。我记得京东那个基于 electron 的 excel 数据清理软件有提到,这里有性能问题

27: .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.v } }), {});
光算时间的话 Object.assign 是 O(n) 的时间复杂度,这 reduce 下去 O(n*n)。
并且每次 assign 都是生成一个新对象,你可以测一下生成 4W 个 object 要多久,并且在每个 obj 上加上 2w 的属性 。

在Node.js环境下处理大量数据并写入Excel文件,确实可能会遇到性能瓶颈,特别是在旧版本的Node.js(如v8.4.0)中。以下是一些可能的优化方案和建议:

  1. 使用流式写入:避免一次性将所有数据加载到内存中,可以使用流式处理来逐行写入Excel。xlsx库支持流式写入,但你可能需要升级到更新的Node.js版本和库版本以获得最佳性能。

  2. 代码示例:以下是一个使用xlsx-stream库的示例,该库支持流式写入Excel文件。注意,你可能需要先安装该库:npm install xlsx-stream

const XLSXStream = require('xlsx-stream');
const fs = require('fs');

const writer = XLSXStream.toBuffer()
  .pipe(fs.createWriteStream('output.xlsx'));

const worksheet = XLSXStream.json_to_sheet([{ header1: 'value1', header2: 'value2' }]); // 示例数据
XLSXStream.add_ws(writer, worksheet, 'Sheet1');

// 假设你有一个大数据数组data
// data.forEach(row => XLSXStream.add_row(writer, row)); // 逐行添加数据

writer.on('finish', () => console.log('Write complete'));

注意:上述代码为简化示例,实际使用时需要根据你的数据结构进行调整。

  1. 升级Node.js:考虑升级到更新的Node.js版本,以获得更好的性能和稳定性。

  2. 内存管理:确保在写入过程中合理管理内存,避免内存泄漏。

如果问题仍然存在,建议查看具体的错误日志,以便进一步诊断问题。

回到顶部