用一个具有单个字段的表创建一个MySQL数据库。然后将文件导入数据库。这将使查找特定行变得非常容易。
我不认为任何东西可以更快(如果head
和tail
已失败)。最后,要查找行的应用程序必须n
遍历整个文件,直到找到n
换行为止。如果不进行某种查找(将行索引移至文件中的字节偏移),则无法获得更好的性能。
鉴于创建MySQL数据库并将数据导入其中非常容易,我觉得这是一种可行的方法。
这是操作方法:
DROP DATABASE IF EXISTS helperDb;
CREATE DATABASE `helperDb`;
CREATE TABLE `helperDb`.`helperTable`( `lineIndex` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `lineContent` MEDIUMTEXT , PRIMARY KEY (`lineIndex`) );
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable (lineContent);
SELECT lineContent FROM helperTable WHERE ( lineIndex > 45000000 AND lineIndex < 45000100 );
/tmp/my_large_file
将是您要读取的文件。
导入在每行上具有制表符分隔值的文件的正确语法是:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
这样做的另一个主要优点是,如果您以后决定提取另一组行,则不必等待数小时即可再次进行处理(当然,除非您删除数据库)。