【发布时间】:2011-12-04 07:48:59
【问题描述】:
在文本文件中,行由每行末尾的 \n 检测。为此,需要读取整个文件,这对于大文件(比如 2GB)来说是个大问题。我正在寻找一种无需遍历整个文件即可读取单行的方法(尽管我知道这应该是一个复杂的过程)。
- 我知道的第一种方法是使用带偏移的 fseek();但不实用。
- 创建键/值的平面文件;但我不确定是否有办法避免将整个加载到 RAM 中(应该类似于在 php 中读取数组)。
-
或者,我们可以在每行的开头制作一些数字以供读取。我的意思是,是否可以通过跳过行内容(转到下一行)来读取行首的第一个数字。
768| line content is here 769| another line 770| something
如果只读取第一个数字,即使是大文件,应该读取的总数据也不多。
【问题讨论】:
-
您始终可以在循环中逐行读取整个文件,提取起始数字并丢弃剩余行。但是,您需要注意性能。对于 2 GB 的文件,这可能需要相当长的时间。
-
我正在寻找的只是避免逐行读取整个文件。
-
您需要阅读可以在行号上索引的特定行吗?如果是这样,只需进行二进制搜索。读取(比如说)文件中间的 200 个字符以找出行号。然后重复任一半,直到你到达正确的线。
-
我的猜测是你必须阅读整个文件 - 或者至少直到你找到你感兴趣的行 - 除非所有行都有相同的长度(我可以看到他们这样做不是)。
标签: php database text flat-file