File 在巨型文件中读取单行的最快方法

File 在巨型文件中读取单行的最快方法,file,sed,line,File,Sed,Line,所以我有一个网站,我需要访问一个巨大的文本文件(~2GB)中的一行(行号已知) 我得出的结论是 system_exec(“sed-n3p修改很少)在大文件中打印单行的最快方法也是使用q(Quit)命令 这将打印第三行,然后sed将停止工作。在很少修改的情况下,在巨型文件中打印单行的最快方法也是使用q(Quit)命令 这将打印第三行,然后sed将停止工作。在很少修改的情况下,在巨型文件中打印单行的最快方法也是使用q(Quit)命令 这将打印第三行,然后sed将停止工作。在很少修改的情况下,在巨型文

所以我有一个网站,我需要访问一个巨大的文本文件(~2GB)中的一行(行号已知)

我得出的结论是


system_exec(“sed-n3p修改很少)在大文件中打印单行的最快方法也是使用q(Quit)命令


这将打印第三行,然后sed将停止工作。

在很少修改的情况下,在巨型文件中打印单行的最快方法也是使用q(Quit)命令


这将打印第三行,然后sed将停止工作。

在很少修改的情况下,在巨型文件中打印单行的最快方法也是使用q(Quit)命令


这将打印第三行,然后sed将停止工作。

在很少修改的情况下,在巨型文件中打印单行的最快方法也是使用q(Quit)命令


这将打印第三行,然后sed将停止工作。

这里有多种方法可以将偏移量转换为文件,以及一些粗略的基准测试

我创建了一个包含90M行的文本文件。每行都包含“something”#####,尽管数字与实际行不匹配(以便更快地创建示例数据)

这些基准测试是在运行OS 10.10.2的1.3GHz i5、4GB RAM、MacBook Air(11英寸,2013年年中)上进行的

首先是
awk
。我真的期望更好

$ time awk 'NR == 10000000{print;exit}' bigfile.txt
something99999

real    0m12.716s
user    0m12.529s
sys     0m0.117s
tail
的表现稍好一些,但仍然相当缓慢

$ time tail -n +10000000 bigfile.txt | head -n 1
something99999

real    0m10.393s
user    0m10.311s
sys     0m0.066s
正如您所发现的,
sed
由于某种原因,目前的表现优于其他竞争者。尽管如此,速度仍然慢得令人无法接受

$ time sed -n '10000000{p;q;}' bigfile.txt
something99999

real    0m3.846s
user    0m3.772s
sys     0m0.053s
如果您有常规数据(每行字节数相同或可以确定地计算每行字节数),您可以完全放弃读取文件并直接偏移到文件中。这是最快的选择,但在数据格式方面也是最严格的。这就是William Pursell在建议将数据填充到固定大小时的用意

$ time tail -c +10000000 bigfile.txt | head -n 1
thing71851

real    0m0.020s
user    0m0.011s
sys     0m0.006s

但是,如果你有一个2G文本文件,你应该考虑使用一个合适的数据库。

$ time sqlite3 bigfile.db << EOF
> create table bigdb(data text);
> .import bigfile.txt bigdb
> EOF

real    3m16.650s
user    3m3.703s
sys     0m4.221s

$ ls -lrth bigfile.db
-rw-r--r--  1 admin  wheel   1.9G Mar  8 10:16 bigfile.db
您应该有一个合适的主键,或者使用sqlite方便的内部列
ROWID
,以获得最佳性能

$ time sqlite3 bigfile.db <<< 'select * from bigdb where ROWID == 10000000;'
something99999

real    0m0.017s
user    0m0.003s
sys     0m0.005s

$time sqlite3 bigfile.db这里有多种方法可以将偏移量转换为文件,还有一些粗略的基准测试

我创建了一个包含90M行的文本文件。每行都包含“something”#####,尽管数字与实际行不匹配(以便更快地创建示例数据)

这些基准测试是在运行OS 10.10.2的1.3GHz i5、4GB RAM、MacBook Air(11英寸,2013年年中)上进行的

首先是
awk
。我真的期望更好

$ time awk 'NR == 10000000{print;exit}' bigfile.txt
something99999

real    0m12.716s
user    0m12.529s
sys     0m0.117s
tail
的表现稍好一些,但仍然相当缓慢

$ time tail -n +10000000 bigfile.txt | head -n 1
something99999

real    0m10.393s
user    0m10.311s
sys     0m0.066s
正如您所发现的,
sed
由于某种原因,目前的表现优于其他竞争者。尽管如此,速度仍然慢得令人无法接受

$ time sed -n '10000000{p;q;}' bigfile.txt
something99999

real    0m3.846s
user    0m3.772s
sys     0m0.053s
如果您有常规数据(每行字节数相同或可以确定地计算每行字节数),您可以完全放弃读取文件并直接偏移到文件中。这是最快的选择,但在数据格式方面也是最严格的。这就是William Pursell在建议将数据填充到固定大小时的用意

$ time tail -c +10000000 bigfile.txt | head -n 1
thing71851

real    0m0.020s
user    0m0.011s
sys     0m0.006s

但是,如果你有一个2G文本文件,你应该考虑使用一个合适的数据库。

$ time sqlite3 bigfile.db << EOF
> create table bigdb(data text);
> .import bigfile.txt bigdb
> EOF

real    3m16.650s
user    3m3.703s
sys     0m4.221s

$ ls -lrth bigfile.db
-rw-r--r--  1 admin  wheel   1.9G Mar  8 10:16 bigfile.db
您应该有一个合适的主键,或者使用sqlite方便的内部列
ROWID
,以获得最佳性能

$ time sqlite3 bigfile.db <<< 'select * from bigdb where ROWID == 10000000;'
something99999

real    0m0.017s
user    0m0.003s
sys     0m0.005s

$time sqlite3 bigfile.db这里有多种方法可以将偏移量转换为文件,还有一些粗略的基准测试

我创建了一个包含90M行的文本文件。每行都包含“something”#####,尽管数字与实际行不匹配(以便更快地创建示例数据)

这些基准测试是在运行OS 10.10.2的1.3GHz i5、4GB RAM、MacBook Air(11英寸,2013年年中)上进行的

首先是
awk
。我真的期望更好

$ time awk 'NR == 10000000{print;exit}' bigfile.txt
something99999

real    0m12.716s
user    0m12.529s
sys     0m0.117s
tail
的表现稍好一些,但仍然相当缓慢

$ time tail -n +10000000 bigfile.txt | head -n 1
something99999

real    0m10.393s
user    0m10.311s
sys     0m0.066s
正如您所发现的,
sed
由于某种原因,目前的表现优于其他竞争者。尽管如此,速度仍然慢得令人无法接受

$ time sed -n '10000000{p;q;}' bigfile.txt
something99999

real    0m3.846s
user    0m3.772s
sys     0m0.053s
如果您有常规数据(每行字节数相同或可以确定地计算每行字节数),您可以完全放弃读取文件并直接偏移到文件中。这是最快的选择,但在数据格式方面也是最严格的。这就是William Pursell在建议将数据填充到固定大小时的用意

$ time tail -c +10000000 bigfile.txt | head -n 1
thing71851

real    0m0.020s
user    0m0.011s
sys     0m0.006s

但是,如果你有一个2G文本文件,你应该考虑使用一个合适的数据库。

$ time sqlite3 bigfile.db << EOF
> create table bigdb(data text);
> .import bigfile.txt bigdb
> EOF

real    3m16.650s
user    3m3.703s
sys     0m4.221s

$ ls -lrth bigfile.db
-rw-r--r--  1 admin  wheel   1.9G Mar  8 10:16 bigfile.db
您应该有一个合适的主键,或者使用sqlite方便的内部列
ROWID
,以获得最佳性能

$ time sqlite3 bigfile.db <<< 'select * from bigdb where ROWID == 10000000;'
something99999

real    0m0.017s
user    0m0.003s
sys     0m0.005s

$time sqlite3 bigfile.db这里有多种方法可以将偏移量转换为文件,还有一些粗略的基准测试

我创建了一个包含90M行的文本文件。每行都包含“something”#####,尽管数字与实际行不匹配(以便更快地创建示例数据)

这些基准测试是在运行OS 10.10.2的1.3GHz i5、4GB RAM、MacBook Air(11英寸,2013年年中)上进行的

首先是
awk
。我真的期望更好

$ time awk 'NR == 10000000{print;exit}' bigfile.txt
something99999

real    0m12.716s
user    0m12.529s
sys     0m0.117s
tail
的表现稍好一些,但仍然相当缓慢

$ time tail -n +10000000 bigfile.txt | head -n 1
something99999

real    0m10.393s
user    0m10.311s
sys     0m0.066s
正如您所发现的,
sed
由于某种原因,目前的表现优于其他竞争者。尽管如此,速度仍然慢得令人无法接受

$ time sed -n '10000000{p;q;}' bigfile.txt
something99999

real    0m3.846s
user    0m3.772s
sys     0m0.053s
如果您有常规数据(每行字节数相同或可以确定地计算每行字节数),您可以完全放弃读取文件并直接偏移到文件中。这是最快的选择,但在数据格式方面也是最严格的。这就是William Pursell在建议将数据填充到固定大小时的用意

$ time tail -c +10000000 bigfile.txt | head -n 1
thing71851

real    0m0.020s
user    0m0.011s
sys     0m0.006s

但是,如果你有一个2G文本文件,你应该考虑使用一个合适的数据库。

$ time sqlite3 bigfile.db << EOF
> create table bigdb(data text);
> .import bigfile.txt bigdb
> EOF

real    3m16.650s
user    3m3.703s
sys     0m4.221s

$ ls -lrth bigfile.db
-rw-r--r--  1 admin  wheel   1.9G Mar  8 10:16 bigfile.db
您应该有一个合适的主键,或者使用sqlite的ha