Tạo một cơ sở dữ liệu MySQL với một bảng duy nhất có một trường duy nhất. Sau đó nhập tệp của bạn vào cơ sở dữ liệu. Điều này sẽ làm cho nó rất dễ dàng để tìm kiếm một dòng nhất định.
Tôi không nghĩ bất cứ điều gì khác có thể nhanh hơn (nếu head
và tail
đã thất bại). Cuối cùng, ứng dụng muốn tìm dòng n
phải tìm kiếm trong toàn bộ tệp cho đến khi tìm thấy n
dòng mới. Nếu không có một số loại tra cứu (chỉ số dòng đến byte bù vào tệp), hiệu suất tốt hơn có thể đạt được.
Với việc dễ dàng tạo cơ sở dữ liệu MySQL và nhập dữ liệu vào đó, tôi cảm thấy như đây là một cách tiếp cận khả thi.
Đây là cách làm:
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
sẽ là tập tin bạn muốn đọc.
Cú pháp đúng để nhập tệp có giá trị được phân định bằng tab trên mỗi dòng là:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Một ưu điểm lớn khác của điều này là, nếu sau này bạn quyết định trích xuất một bộ dòng khác, bạn không phải đợi hàng giờ để xử lý lại (trừ khi bạn xóa cơ sở dữ liệu).