単一のフィールドを持つ単一のテーブルで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);
これのもう1つの大きな利点は、後で別の行セットを抽出することに決めた場合、処理を再度何時間も待つ必要がないことです(もちろんデータベースを削除しない限り)。