【问题标题】:How to get the line count of a large file, at least 5G如何获取大文件的行数,至少5G
【发布时间】:2012-09-08 01:03:59
【问题描述】:

如何获取大文件的行数,至少5G。使用 shell 的最快方法。

【问题讨论】:

标签: shell file-io


【解决方案1】:

Step 1: head -n filename > newfile // 将前 n 行放入 newfile,e.g. n =5

第 2 步:获取巨大的文件大小,A

第 3 步:获取新文件大小,B

第 4 步:(A/B)*n 大约等于确切的行数。

将n设置为不同的值,多​​做几次,然后取平均值。

【讨论】:

  • 这为您提供了文件中行数的近似值。如果不以某种方式读取整个文件,您将无法获得准确的计数。如果前 n 行恰好比平均值更长或更短,则估计值可能会有所偏差。并且平均 n 的不同值的结果似乎很奇怪。您尝试的最大 n 将包含所有较小值的结果。仅对一些较大的 n 进行一次测量可能比建议的平均方法更好。无论如何,我回答中的 cmets 表明 wc -l 大约需要 90 秒。
【解决方案2】:

最快的方法可能是wc -l

wc 命令已经过优化,可以做这种事情。您可以做的任何其他事情(除了在更强大的硬件上进行)都不太可能更快。

是的,计算 5 GB 文本文件中的行数很慢。文件很大。

唯一的选择是首先以某种不同的格式存储数据,可能是数据库,也可能是具有固定长度记录的文件。将您的 5 GB 文本文件转换为其他格式会导致 至少 与在其上运行 wc -l 一样错误,但如果您愿意,可能值得会大量计算行数。如果没有更多信息,就不可能说出权衡是什么。

【讨论】:

  • 对于那个大小的纯文本文件,wc 在第一次调用该文件时花费了相对较短的时间,而在以后使用相同文件作为输入的调用时大约需要 2 秒。
  • 第一次缓存文件解释了这一点,请参阅@Ivella 的评论:stackoverflow.com/a/12716620/1959808
  • @johntex:“相对较短的时间”是什么意思?
  • sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"清空缓存后,按照here的建议,wc -l第一次调用4.3G文件耗时1m31s。
  • 作为比较,sed -n '$=' 花了 1m33s,所以基本相同。
猜你喜欢
  • 1970-01-01
  • 2011-10-21
  • 2017-03-18
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
相关资源
最近更新 更多