Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript读取大型CSV文件而无需将所有内容加载到内存的最佳方法_Javascript_Node.js_File_Csv_Electron - Fatal编程技术网

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

使用Javascript读取大型CSV文件而无需将所有内容加载到内存的最佳方法,javascript,node.js,file,csv,electron,Javascript,Node.js,File,Csv,Electron,我正在使用Atom/Electron构建一个基于数据的视频可视化应用程序。每个视频都有一个对应的CSV文件,其中包含每个帧的信息。视频大约有100分钟,因此文件中有大量数据 我遇到的问题是加载和解析文件需要几秒钟的时间。大多数情况下,这不是问题。但我需要制作部分视频的播放列表,每次视频更改时加载整个CSV文件是不可行的 我一直在寻找文件流选项作为快速csv,但我没有设法开始读取文件的任意部分 编辑:来自FS文档。在这种情况下,问题是如何知道哪个字节对应于我想要在文件中的位置 选项可以包括开始值和

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

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

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

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

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

对于这种情况,你认为什么是更好、最有效的方法

具体而言:

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

<>你认为还有另一种存储方法能让我更好地解决这个问题吗?< 更新:


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

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

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

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

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

Sqlite的内部工作方式

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

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

    可能的缺点

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

    • Standalone将要求一切都在客户端。这通常是Sqlite的使用方式。我过去在游戏中使用过它,利用API用Java连接到数据库;API让整个体验感觉就像服务器上的PHP和MySQL。您可能需要找到其他API,因为Sqlite是用C编写的
    • 混合灌输与独立灌输的方式相同,但您可以在程序中编写到实际服务器的链接。对于我帮助制作的游戏,我们将跟踪分数和用户数据等信息,然后定期在后台将这些信息传递给实际的服务器,如果我们能够获得连接的话。这也反过来起作用。您可以无需任何东西就启动用户,但在第一次运行时,它可以下载您需要的所有内容,从那时起,它可以随时更新服务器上的内容
    摘要


    Sqlite可以满足您的需要,但可能需要一些家庭作业才能按照您需要的方式进行设置。例如,Sqlite4java易于安装,但由于其文档太差,学习起来容易混淆;堆栈溢出让我度过了难关。Sqlite也是一种使用即忘的安装类型,因此为了回答您的问题,它可以像蛋糕一样每秒处理25行,您不必担心只优化您自己的代码。

    csv中的列宽是固定的吗?(例如,第1列总是20个字符)这个问题可能有用:我对节点的了解不够,无法确定答案,但在我看来,您可能希望一次在csv的行上发送。@DevinH。不,但每一列都是一个数字,所以使用某种填充并不困难。理想情况下,我宁愿不这样做。我正在考虑为每一行的字节位置建立索引。并存储一个包含位置的数组。第一次加载文件时进行一些处理不会有问题。每次读取时指定缓冲区块?这样你一次只能读一小段(我不确定,但看起来像是我的第一种方法)@Bwaxxio我想你误解了这个问题。他似乎试图随机访问文件的一小部分,而不是流式传输整个内容。好吧,这看起来很酷,但我认为这与快速csv或csv解析器没有什么不同。它并没有给我一种从任意csv行开始流式处理的方法。如果我必须从一开始就开始流媒体,那么解决方案不适合我的情况。你知道有没有一种方法可以跳到某个特定的位置