我在查看非常大的文本文件块时遇到问题。这个大约 19 GB 的文件显然太大了,无法通过任何传统方式查看。
我已经尝试过head 1and tail 1( head -n 1and tail -n 1) 以各种方式将两个命令连接在一起(以获取中间部分),但没有运气。我的运行 Ubuntu 9.10 的 Linux 机器无法处理这个文件。
我如何处理这个文件?我的最终目标是在 45000000 和 45000100 线上磨练。
Kyl*_*nes 16
你应该使用sed.
sed -n -e 45000000,45000100p -e 45000101q bigfile > savedlines
Run Code Online (Sandbox Code Playgroud)
这告诉sed打印第 45000000-45000100 行,并在第 45000101 行退出。
使用具有单个字段的单个表创建 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 );
Run Code Online (Sandbox Code Playgroud)
/tmp/my_large_file将是您要读取的文件。
导入每行都包含制表符分隔值的文件的正确语法是:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Run Code Online (Sandbox Code Playgroud)
这样做的另一个主要优点是,如果您稍后决定提取另一组行,则不必等待数小时才能再次处理(当然,除非您删除数据库)。
| 归档时间: |
|
| 查看次数: |
14808 次 |
| 最近记录: |