读取json文件,require和fs.readFile哪个性能更好?

需求:想监听一个json文件的变化,需要知道其变更前后的数据差异。

思路:使用chokidar监听json文件,在addchange事件回调中通过requirefs.readFile获取到文件数据。

问题:该json文件数据较大,存放的着几百万条文件的数据,每条数据约200字节。总大小1G多。不知道能否通过require读取这么大的文件,读取效率相比fs.readFile如何。

阅读 5.8k
4 个回答

尝试造数据模拟跑了10+,得出下列对比数据,从统计数据上看有2个结论:

1、require读取JSON文件 相当于 fs.readFileSync + JSON.parse,明显在这题里,require方案不用考虑

2、如果只是读取文本数据,fs.readFile 要比 fs.createReadStream 快得多,但是如果要转成数据的话,反而是 fs.createReadStream 快的多且稳定,数据量越大越明显。

700w条数据,134Mfs.readFileSyncfs.readFilefs.createReadStreamrequire + 删缓存
读取文本数据294ms294ms1220ms-
读取JSON对象数据(文本再转对象)27200ms27200ms16000ms27000ms
1000w条数据,495Mfs.readFilefs.createReadStream
读取文本数据422ms1690ms
读取JSON对象数据(文本再转对象)47571ms28016ms

以stream的形式读文件指定位置,这样不用读取全部

1G多的json文件太大了,不应该直接读到内存.
另外, require 是会有缓存的, 如果要手动删除 require 缓存, 再重新引入, 又比较复杂..
所以还是用读取部分, 然后对比的方式比较好.

新手上路,请多包涵

@星空 问个小点,文本转数据是读取完成再转的么

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题