【发布时间】:2013-05-20 10:13:44
【问题描述】:
我有一个 PHP 脚本,它可以很好地处理大型文本文件,主要是日志文件。问题是大多数时候我只想要它的一部分,从一个分裂点到另一个分裂点。但是必须读取 2GB 的文本文件才能获取其中的一小部分,这会减慢处理速度。
有什么方法可以只读取部分文本而不必将整个文件读入内存?
数据是这样存储的:
|18.05.2013: some log info here...
|19.05.2013: some log info here...
|20.05.2013: some log info here...
|21.05.2013: some log info here...
|22.05.2013: some log info here...
| etc...
因此,如果我只想要“19.05.2012”,我仍然需要阅读所有其他文本。有什么办法可以让我只看那部分吗?
附:数据库不是一个选项,将文件拆分成更小的文件也是不切实际的。
【问题讨论】:
-
你使用的是什么操作系统?
-
“数据库不是一个选项” - 为什么不呢?
-
如果文件中的每条“记录”都是可变长度的,那么您无法知道要跳过多远。如果您事先建立某种索引,则可以,但在这种情况下似乎不值得。
-
好吧,您必须通读它才能阅读部分内容。
fgets-ing 通过它不是一种选择吗?内存方面,它非常轻量级,如果你知道在某个点之后没有条目,你可以很快中止。此外,如果这是一个日志文件,一个不错的logrotate配置会很有帮助。