最好的方式来读取一个大的CSV文件,而不使用Javascript加载到内存

我正在使用Atom / Electron构build一个基于数据对video进行可视化的应用程序。 每个video都有相应的CSV文件,每个帧都有相应的信息。 这些video大约100分钟,所以文件有大量的数据!

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

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

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

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

对于这种情况,你认为哪种方法更好,性能最好?

具体来说:

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

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

根据我的评论, Sqlite似乎是你要找的。 从长远来看,这可能并不是永久性的解决scheme,但是当您决定是否坚持使用或者编写自己的解决scheme时,它肯定会有效。

Sqlite的内部工作原理

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

  1. 整个数据库(您创build的每个数据库)都存储在一个文件中,而不是多个文件或logging。
  2. 这个文件被分页成1024字节(1K)块,可以让你轻松地跳转数据。
  3. (真的是2的一部分)整个数据库和分页系统是一个巨大的二叉树,通常需要10个跳转才能find任何给定的数据。 所以用通俗的话来说,速度非常快!

如果你真的有兴趣了解所有这一切的全部范围,我发现没有比这个由Julia Evans这个惊人的博客文章更好的解释。

可能的缺点

除了内部工作,Sqlite被devise成在用户机器上的客户端工作。 如果这不是一个可行的解决scheme,可以做的解决方法。 Sqlite可以用作Web服务器,但是它确实在独立或混合安装中发展得最好。 还记得每一个客户端电脑是不同的。 一台计算机可能比另一台计算机更快地处理logging,但一般来说,您不必担心,因为客户端计算机通常负载很小。

  • 独立会要求一切都在客户端。 这通常是如何使用Sqlite的。 我过去曾经使用过它,利用sqlite4java的 API通过Java连接到数据库; API使整个体验感觉像服务器上的PHP和MySQL。 你可能需要find其他的API,因为Sqlite是用C编写的
  • 混合滴注与独立完成的方式完全相同,但是您将程序代码链接到实际的服务器。 对于我帮助过的游戏,我们会跟踪分数和用户数据等事情,然后定期在后台传递给实际的服务器,如果我们能够获得连接。 这也是相反的。 你可以只用第一次运行就可以启动用户,它可以下载你需要的所有东西,然后保持自己与服务器上的内容保持同步。

概要

Sqlite将为您所需要的工作,但可能需要一点功课,以您需要的方式进行设置。 例如Sqlite4java易于安装,但由于其文档太差而难以学习; 堆栈溢出让我通过它虽然。 Sqlite也是一个使用它,并忘记它的安装types,所以要回答你的问题,它会像蛋糕一样处理25行,你不必担心优化它只有你自己的代码。

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

在一个传递给parsing函数的configuration对象中,你可以给出一个“step”参数,这个参数是文件每一行执行时要执行的一个函数。

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

http://papaparse.com/docs