2014-12-13 14 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線...

(請,如果你做的實驗與您的數據,向我們展示了倍)

相關問題