2014-12-13 11 views
0

我有30Gb制表符分隔的文本文件与数字,我需要最快的方式索引它并做第一和第二列的查询。我试过MongoDB,但上传数据到数据库需要很长时间,我试过通过json文件进行mongoimport,但它需要大量的时间。最快速的方式来索引和查询巨大的制表符分隔文件

mongoimport --upsert --upsertFields A,B,S1,E1,S2,E2 -d数据库名-c 表名data.json

数据文件片段:

504 246 91.92007 93 0 4657 5631 5911 0 39 1061 1162 
813 469 92.14697 109 0 2057 2665 7252 1 363 961 1399 
2388 987 92.20945 61 0 1183 1575 1824 0 66 560 5088 
2388 2323 92.88472 129 0 75 1161 1824 1 2516 3592 12488 
2729 1008 95.29058 47 0 435 1166 1193 1 76 654 1055 
2757 76 94.25837 12 0 0 44 1946 0 51 68 247 
2757 2089 92.63158 14 0 12 30 1946 0 14 30 211 

用最少的时间做正确有效的方法是什么?任何有关最好的数据库提示?或者关于mongo上传速度优化?

查询的示例:

objs = db.TableName.find({'A':2757}) 
objs = db.TableName.find({'B':76}) 

对于列A和B有多达1000个命中与平均20

+0

你要多久查询?你有一个示例查询? – 2014-12-13 12:27:52

+0

30Gb/50 = 600Mtuples!需要上传多长时间并制作索引? – JJoao 2014-12-13 18:10:54

+0

您的问题是关于进口速度,查询速度还是两者?仅供参考,MongoDB 2.6中的'mongoimport'工具是单线程的,因此不是导入大型数据集的最快方法。对于即将发布的MongoDB 2.8版本,命令行工具已在Go中重写,以提高性能和并发性。 MongoDB 2.8目前仍处于候选版本阶段(2015年12月15日),但您可以尝试新的'mongoimport'进行比较。为了加快查询速度,您需要提供更多信息,首先使用.explain(true)输出查询。另外,你的MongoDB版本。 – Stennie 2014-12-14 19:58:13

回答

1

数据库的每个号码通常具有复杂的工作,以便更稳健做。

如果您使用strait B-tree索引,通常它会更快。

以下您将在perl中找到上传脚本。

#!/usr/bin/perl 
use DB_File; 
use Fcntl ; 

# $DB_BTREE->{'cachesize'} = 1000000; 
$DB_BTREE->{'flags'} = R_DUP ; 

my (%h, %h1, %h2,$n); 

my $x = tie %h, 'DB_File', "bf.db", O_RDWR|O_CREAT|O_TRUNC , 0640, $DB_BTREE; 
my $x1= tie %h1, 'DB_File', "i1.db", O_RDWR|O_CREAT|O_TRUNC , 0640, $DB_BTREE; 
my $x2= tie %h2, 'DB_File', "i2.db", O_RDWR|O_CREAT|O_TRUNC , 0640, $DB_BTREE; 

while(<>){ chomp; 
    if(/(\d+)\s+(\d+)/){ 
    $h{++$n}=$_;   ## add the tup 
    $h1{$1} = $n;   ## add to index1 
    $h2{$2} = $n   ## add to index2; 
    } 
} 

untie %h; 
untie %h1; 
untie %h2; 

和查询:

#!/usr/bin/perl 
use DB_File; 
use Fcntl ; 
$DB_BTREE->{'flags'} = R_DUP ; 

my (%h, %h1, %h2, $n, @list); 

my $x = tie %h, 'DB_File', "bf.db", O_RDWR|O_CREAT , 0640, $DB_BTREE; 
my $x1= tie %h1, 'DB_File', "i1.db", O_RDWR|O_CREAT , 0640, $DB_BTREE; 
my $x2= tie %h2, 'DB_File', "i2.db", O_RDWR|O_CREAT , 0640, $DB_BTREE; 

while(<>){ chomp;     # Queries input format: A:number or B:number 
    if(/A:(\d+)/){ 
     @list = sort $x1->get_dup($1) ; 
     for(@list){print $h{$_},"\n"; } 
    } 
    if(/B:(\d+)/){ 
     @list = sort $x2->get_dup($1) ; 
     for(@list){print $h{$_},"\n"; } 
    } 
} 

查询是非常快的。

但是上传了20多岁(用户时间)为1条000 000线...

(请,如果你做的实验与您的数据,向我们展示了倍)

相关问题