问题描述
我正在使用 Electron JS 构建一个离线应用程序并响应 JS。 在启动步骤中,首先是加载一个大文件(超过 1 GB 且无法拆分) 所以我必须等待大约 50-60 秒,直到这个文件完全加载。 有没有办法在第一次启动时加载它,然后将它保存到缓存中,这样下次我启动我的应用程序时就不会花费那么多时间?
解决方法
在下一次应用启动之前,您无法在内存中缓存数据。当应用程序关闭时,数据就消失了。 解决的方法不多:
方法一(缓存数据直到应用关闭):
在启动时异步读取文件(因此它不会冻结应用程序)并通过将数据存储在变量中将其缓存在内存中。该应用将占用 >1GB 的 RAM,并且在应用关闭时缓存将消失。
方法二(分块读取数据):
您是否需要一次处理整个数据集?如果不是,请不要读取整个文件,将其分成多个块(文件)并在运行时需要时读取特定文件。
方法三(边读边计算):
您只需要数据来计算一次,使用流从驱动器读取 json 并在流期间对每个 JSON 对象实时执行计算。到流结束时,所有需要的计算都将完成,应用程序将不需要 ~1 GB 的 RAM。为此有几个模块:stream-json、bfj、big-json
,通常您一开始就不需要整个文件。您能否分享这个大文件的性质以帮助更好地理解问题?
内存中的“缓存”是不可能的,当应用程序退出时内存会被清除。这就是内存的工作原理。
但问题是,将 1GB 读入内存不应该花费 60 秒,这太长了。我想您还需要找出其他瓶颈。
我的建议是尝试同步读取文件,并测量它所花费的实际时间。您可以使用 Node.js 的 "perf_hooks"
内置模块来测量时间。我的猜测是,将文件加载到内存最多需要 1 秒,所以 59 秒用于做其他一些事情。问题很可能在其他地方。
现在,如果瓶颈真的是将文件从磁盘加载到内存中,那么 mmap
系统调用可能就是您所需要的。不过那是另一个话题了。