从大型CSV文件读取而不使用Javascript将所有内容加载到内存的最佳方式

时间:2015-06-22 19:08:52

标签: javascript node.js file csv electron

我正在使用Atom / Electron构建一个基于数据对视频进行可视化的应用。每个视频都有一个相应的CSV文件,其中包含每个帧的信息。视频大约100分钟,所以文件有足够的数据!

我遇到的问题是加载和解析文件需要几秒钟。大多数时候这不是问题。但我需要制作部分视频的播放列表,每次更改视频时加载整个CSV文件都不是一个可行的选择。

我一直在寻找文件流选项作为fast-csv,但我没有设法开始阅读文件的任意部分。

编辑:来自FS文档。在这种情况下,问题是如何知道哪个字节对应于文件中我想要的位置?

  

选项可以包括读取一系列字节的起始值和结束值   从文件而不是整个文件。开始和结束都是   包容性,从0开始。

您认为对这种情况采取更好,最有效的方法是什么?

具体:

有没有办法从CSV文件的任何部分开始读取流?

你认为还有另一种存储方法可以让我更好地解决这个问题吗?

更新:

最后,我通过将数据存储在二进制格式的文件中来解决这个问题。因为我知道文件有多少列,所以我可以直接从文件段中读取,而不会影响性能。

2 个答案:

答案 0 :(得分:3)

我强烈推荐Papaparse。它允许CSV'逐行'的流式传输,可以基于文件中的标头以JSON格式处理。

在传递给解析函数的配置对象中,您可以给出一个'step'参数,该参数是在文件逐步执行时对文件的每一行执行的函数。

注意:还可以配置为在处理非常大的CSV时使用工作线程来提高性能

http://papaparse.com/docs

答案 1 :(得分:1)

根据我的评论,Sqlite似乎就是你要找的。从长远来看,它可能不是你永久的解决方案,但当你决定是坚持使用它还是编写自己的解决方案时,它肯定会有效。

Sqlite的内部工作

Sqlite针对核心进行了优化,但它有三个主要功能,使其执行速度比普通磁盘读取速度快,尤其是CSV文件:

  1. 整个数据库(您创建的每个数据库)都存储在一个文件中,而不是多个文件或记录中。
  2. 此文件被分页为1024字节(1K)块,允许您轻松跳转数据。
  3. (实际上是2的一部分)整个数据库和分页系统是一个庞大的二叉树,通常需要不到10次跳转才能找到任何给定的数据。所以用外行人的话说,非常快!
  4. 如果你真的有兴趣了解所有这一切的全部范围,我找不到比this amazing blog post by Julia Evans更好的解释。

    可能的缺点

    除了内部工作原理之外,Sqlite还设计为客户端在用户机器上工作。如果这不是一个可行的解决方案,那么可以做一些变通方法。例如,Sqlite可以用作Web服务器,但它最好是独立或混合安装。还要记住每个客户的计算机都不同。一台计算机可以比下一台计算机更快地处理记录,但通常您不必担心,因为客户端计算机通常负载很小。

    • Standalone需要一切都在客户端。这通常是如何使用Sqlite的。我过去曾将它用于游戏,利用sqlite4java's API通过Java连接到数据库; API使整个体验感觉像服务器上的PHP和MySQL。您可能需要找到其他API,因为Sqlite是用C语言编写的。
    • 混合灌注与独立完成相同,但您可以在程序中编写指向实际服务器的链接。对于我帮助制作的游戏,我们会跟踪分数和用户数据等内容,然后在后台定期将其传递给实际的服务器(如果我们可以获得连接)。这也是相反的。除了第一次运行之外,您可以启动用户,它可以下载您需要的所有内容,然后保持自己与服务器上的内容保持同步。

    <强>摘要

    Sqlite可以满足您的需求,但可能需要一些功课来以您需要的方式进行设置。例如,Sqlite4java易于安装,但由于文档很差,因此难以学习; Stack Overflow让我通过它。 Sqlite也是一个使用它并忘记它的安装类型所以为了回答你的问题,它会像蛋糕一样处理25行,你不需要担心只优化它自己的代码。