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

lim*_*gni 8 javascript csv file node.js electron

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

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

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

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

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

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

具体来说:

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

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

更新:

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

Bli*_*gle 1

根据我的评论,Sqlite似乎就是您所寻找的。从长远来看,它可能不是您的永久解决方案,但当您决定是否要坚持使用它或编写自己的解决方案时,它肯定会暂时起作用。

Sqlite 的内部工作原理

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

  1. 整个数据库(您创建的每个数据库)存储在 1 个文件中,而不是多个文件或记录中。
  2. 该文件被分页为 1024 字节 (1K) 块,使您可以轻松地跳转数据。
  3. (实际上是 2 的一部分)整个数据库和分页系统是一棵巨大的二叉树,通常需要不到 10 次跳转才能找到任何给定的数据。所以通俗地说,就是极快!

如果您真的有兴趣了解所有这些内容的全部范围,我找不到比Julia Evans 的这篇精彩博客文章更好的解释了。

可能的缺点

除了内部工作之外,Sqlite 还被设计为在用户计算机上工作的客户端。如果这不是一个可行的解决方案,则可以采取一些解决方法。例如,Sqlite 可以用作 Web 服务器,但它在独立或混合安装中确实表现最佳。还要记住每个客户的计算机都是不同的。一台计算机处理记录的速度可能比另一台计算机快,但通常您无需担心,因为客户端计算机通常负载很小。

  • 独立需要一切都在客户端。这就是 Sqlite 的典型使用方式。我过去曾将它用于游戏,利用sqlite4java的API用Java连接数据库;API 让整个体验感觉就像服务器上的 PHP 和 MySQL。由于 Sqlite 是用 C 编写的,因此您可能需要查找其他 API。
  • 混合注入的完成方式与独立注入相同,但您可以在程序中编写指向实际服务器的链接。对于我帮助制作的游戏,我们会跟踪分数和用户数据等内容,然后在后台定期将其传递到实际服务器(如果我们可以获得连接)。这也适用于相反的情况。您可以什么都不启动用户,但在第一次运行时它可以下载您需要的所有内容,并从那时起保持其自身与服务器上的内容保持同步。

概括

Sqlite 可以满足您的需要,但可能需要一些作业才能以您需要的方式进行设置。例如,Sqlite4java 很容易安装,但学习起来很混乱,因为他们的文档太差了;不过 Stack Overflow 帮助我度过了难关。Sqlite 也是一种使用它并且忘记它的安装类型,所以回答你的问题,它会像蛋糕一样每秒处理 25 行,你不需要担心只优化你自己的代码。