9

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

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

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

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

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

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

具体来说:

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

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

更新:

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

4

2 回答 2

3

为此,我强烈推荐 Papaparse。它允许 CSV 的“逐行”流式传输,可以根据文件中的标头以 JSON 格式处理。

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

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

http://papaparse.com/docs

于 2015-07-23T17:00:39.437 回答
1

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

Sqlite 的内部工作原理

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

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

如果您真的有兴趣了解所有这些内容的全部范围,我发现没有比Julia Evans 的这篇令人惊叹的博客文章更好的解释了。

可能的缺点

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

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

概括

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

于 2015-07-24T16:24:19.283 回答