【问题标题】:Fast way to read range of lines from large file of size > 10GB [closed]从大小> 10GB的大文件中读取行范围的快速方法[关闭]
【发布时间】:2019-11-24 04:04:45
【问题描述】:

我有一个大小 > 10GB 的 csv 文件,需要在每个页面上显示 100 行并进行分页。

我正在使用带有 SED 的 PHP 来获取 100 行文件,如下所示

 sed -n '16224,16482p;16483q' filename > newfile

sed example from here

在 PHP 中,我执行如下 SED 命令来获取行范围

 $res="sed -n '".$starting.",".$stateEnd."p;".$exitState."q' common.csv > newfile.csv 2>error.log";
 $output_result = shell_exec($res);

但这需要很长时间才能从文件中获取 100 行的范围。

有没有更好的方法、快速的阅读方法来获取任何这些语言中的一系列行,例如 JAVA、PHP 或 PYTHON 或 SHELL SCRIPT 或 Linux 命令。

有人可以举个例子吗

【问题讨论】:

  • 您意识到,为了读取 100 行的任意块,您必须读取它们之前的所有内容(以便找到那 100 行),所以会有对可以加速多少有一个相当严格的限制。
  • 如果您最有可能逐块显示 - 最好在 PHP 中阅读它(使用 fopen() 等)并记住您阅读的位置(使用 ftell()) ,然后下次使用fseek() 跳转到您上次中断的开始处。
  • @ScottHunter 是的,同意你的观点,但会有一些我不知道的语言选项:(
  • 假设它是简单的 csv 数据,没有包含嵌入换行符的字段...split 派上用场。
  • 基本上问题在于 CSV 文件不是保存您实际想要处理的 10Gig 数据的最佳方式。快速/明智地。您是否考虑过使用 CSV 构建数据库表。这将使其更加灵活

标签: java php python linux sed


【解决方案1】:

如果相对于它的更改频率,同一个文件将被多次使用,您可以创建一个索引,确定文件中某些行的位置,这将允许您向前跳过并开始实际阅读更接近您的行想要。

【讨论】:

  • 不知道怎么做,文件会每天更新
  • 如果文件每天都会更新,那么它应该存储在适合该要求的数据库或格式中。
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多