Tek bir alana sahip tek bir tablo ile bir MySQL veritabanı oluşturun. Ardından dosyanızı veritabanına alın. Bu, belirli bir çizgiye bakmayı çok kolay hale getirecektir.
Başka bir şeyin daha hızlı olabileceğini düşünmüyorum ( head
ve tail
zaten başarısız olursa). Sonunda, satır bulmak isteyen uygulama yeni satırlar n
bulunana kadar tüm dosyayı aramak zorundadır n
. Bir çeşit arama olmadan (dosyaya ofset bayt satır-endeksi) daha iyi bir performans elde edilemez.
Bir MySQL veritabanı oluşturmanın ve içine veri aktarmanın ne kadar kolay olduğu düşünüldüğünde, bunun uygulanabilir bir yaklaşım olduğunu hissediyorum.
İşte nasıl yapılacağı:
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
okumak istediğiniz dosya olurdu.
Her satırda sekmeyle ayrılmış değerleri olan bir dosyayı içe aktarmak için doğru sözdizimi şöyledir:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Bunun bir diğer önemli avantajı, daha sonra başka bir satır kümesi çıkarmaya karar verirseniz, işlem için tekrar saatlerce beklemek zorunda kalmamanızdır (elbette veritabanını silmediğiniz sürece).