亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4189 | 回復(fù): 15
打印 上一主題 下一主題

求一個(gè)好的思路,效率問題 【已解決】 [復(fù)制鏈接]

論壇徽章:
1
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-04-30 09:48 |只看該作者 |倒序?yàn)g覽
本帖最后由 chenhao392 于 2013-05-01 09:17 編輯

數(shù)據(jù)描述:

1. 700萬條長短不一的string,每一個(gè)都有uniq name。
2. 大多數(shù)比較短,有些很長 (1Mb+)3. 總共 4Gb +

   生物信息注釋: 一個(gè)基因組,很多染色體片段。   sample:


   seq1: AAAAAAAAAAA
   seq2: BBBBBBBBBBB

需求:



用戶提供,
        1) string name (如seq1)
        2) 起始和結(jié)束的位置,如 (20, 60)

server快速返回substring,并在網(wǎng)頁上顯示。




硬件:


webserver: 2個(gè) CPU,2G內(nèi)存, FC18, LAMP 網(wǎng)站。
其他電腦支持: 16 CPU, 48Gb 內(nèi)存, linux.


我的嘗試:


mysql 直接存儲一個(gè)大表,通過內(nèi)建的length 計(jì)算原string長度,修改用戶的input,之后通過substr拿到substring。
現(xiàn)在是拿PHP寫的,結(jié)果需要等待1分鐘以上。因?yàn)榍岸耸茿JAX的,感覺不可忍。


設(shè)想方案:


由于webserver的內(nèi)存和CPU都比較一般。我想是不是可以寫一個(gè)perl 的CGI。用
Storable (http://search.cpan.org/~ams/Storable-2.24/Storable.pm), BerkeleyDB(http://search.cpan.org/~pmqs/BerkeleyDB-0.51/BerkeleyDB.pod.P
這一類的module 將整個(gè)關(guān)聯(lián)數(shù)組/hash ,寫到硬盤上。再利用perl的substr 提取string 片段。





問題:



1. 請問這樣是否能提高效率呢?

   用內(nèi)存時(shí),用hash搜索string的name,應(yīng)該是不耗時(shí)間的,substr似乎也夠快。問題在于,4G的數(shù)據(jù),寫了hash存硬盤,會影響效率么?



2. 或者有沒有更好的想法?



  感謝閱讀和任何想法:)



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
更新:問題已經(jīng)解決.



感謝樓上的朋友們的建議,測試訪問速度基本瞬時(shí)了,1s以內(nèi)。
然后,我并不要求并發(fā)數(shù).

to iamlimeng:
數(shù)據(jù)是相對固定的,分割小文件也絕對會加快速度,謝謝。只是現(xiàn)在的大文件已經(jīng)讓我滿足了。

to laputa73:
48G的電腦可以幫忙計(jì)算數(shù)據(jù),不能對外訪問。感謝告知redis的存在,我沒有用單純是不想花時(shí)間學(xué)redis,就寫了個(gè)perl. 事實(shí)上還是用DB_File 存儲hash來實(shí)現(xiàn)快速搜索,所以,一定意義上也算 “鍵值”數(shù)據(jù)庫吧 :)

to soul20040103:
感謝建議。其實(shí)昨天我面對的主要的問題是mysql中substr的效率問題,之后想到perl的substr,但是擔(dān)心perl里面大文件訪問也影響速度,抱歉沒有表達(dá)清楚。

to Perlvim:
事實(shí)證明通過結(jié)合Berkeley DB和Perl的substr,我實(shí)現(xiàn)了需求。 DB_File 是Berkeley DB的interface。
http://search.cpan.org/~pmqs/DB_File-1.827/DB_File.pm#Opening_a_Berkeley_DB_Database_File
然后,今天所有代碼都是通過vim 寫的:)

to anyevent:
其實(shí)就是花在計(jì)算string的長度和截取片段上了。那些短片段多為無用的junk,但是不好舍棄。一般來說,大的片段上才含有完整的基因,我其實(shí)想要實(shí)現(xiàn)的是,給出一個(gè)基因的位置,拿到基因本身,以及其左右一定長度的序列。感謝告知elasticsearch, 我也見過一個(gè)有趣的應(yīng)用,叫tableau. 圖像化data的。http://www.tableausoftware.com/products
葉詩文被誣陷時(shí),一幫理科生曾用它來快速反應(yīng),http://www.ittc.ku.edu/huanlab/swimData


具體代碼:


Step 1. 我利用DB_File module 將整個(gè)大表寫成文件,代碼如下:
  1. #!/usr/bin/perl
  2. #

  3. use strict;
  4. use warnings;
  5. use DB_File;

  6. my %hash;
  7. tie (%hash, "DB_File","wheatA_genome.db") or die "$!\n";

  8. open FILE, "<$ARGV[0]" or die "$!\n";
  9. while(<FILE>){
  10.         chomp;
  11.         my($id,$seq)=split(/\t/,$_);
  12.         $hash{$id}=$seq;
  13. }
  14. close FILE;
復(fù)制代碼
Step 2. 我在server端寫了個(gè)perl 的CGI
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use DBI;
  5. use DB_File;
  6. use CGI qw/param/;


  7. #parameter
  8. my $str=param('q');
  9. my $flank=param('f');


  10. #mysql
  11. my $db = "DBI:mysql:wheat_database:localhost;mysql_socket=/var/lib/mysql/mysql.sock";
  12. my $user_name = "****";
  13. my $password = "****";
  14. my ($dbh,$sth,$scaf,$start,$end,$genome);
  15. my @result;


  16. $dbh=DBI->connect($db,$user_name,$password, {RaiseError => 1});
  17. &mysql($str,"A");
  18. &mysql($str,"D");
  19. $dbh->disconnect();


  20. #header
  21. print "Content-type:text/html\n\n";



  22. my %hash;
  23. tie(%hash,"DB_File","wheat".$genome."_genome.db" ) or print "$!\n";
  24. if(defined $hash{">".$scaf}){
  25.         my $length=length($hash{">".$scaf});
  26.         $start-=($flank+1);
  27.         $end+=$flank;
  28.         if($start <0    ){      $start=0;}
  29.         if($end >=$length){     $end=$length;}
  30.         my $seq_length=$end-$start;
  31.         my $result=substr($hash{">".$scaf},$start,$seq_length);

  32.         print " <textarea name='wheat_scaf_seq' rows='5' cols='120'>";
  33.         print ">$scaf:$start-$end\n$result\n";
  34.         print "</textarea>";

  35. }
  36. else{
  37.         print "<h3>not found!</h3>";
  38. }


  39. sub mysql{
  40.         my ($gene_id,$genome_guess)=@_;
  41.            $sth=$dbh->prepare("SELECT * FROM wheat".$genome_guess."_gene_info WHERE wheat".$genome_guess."_id like '%".$gene_id."%'");
  42.            $sth->execute();
  43.         my @array=$sth->fetchrow_array();
  44.         if (@array >0){
  45.                 $scaf=$array[3];
  46.                 $start=$array[4];
  47.                 $end=$array[5];
  48.                 $genome=$genome_guess;
  49.         }
  50.         $sth->finish();
  51. }

復(fù)制代碼

參考javascript
  1. function show_wheat_scaf_seq(){


  2.         var str=document.getElementById('q').value;
  3.         var flank=document.getElementById('f').value;


  4.         if (str=="" || flank ==""){
  5.                 document.getElementById("wheat_scaf").innerHTML="";
  6.                 return;
  7.         }

  8.         if (window.XMLHttpRequest){
  9.                 // code for IE7+, Firefox, Chrome, Opera, Safari
  10.                 xmlhttp=new XMLHttpRequest();
  11.         }
  12.         else{
  13.                 // code for IE6, IE5
  14.                 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  15.         }

  16.         xmlhttp.onreadystatechange=function(){
  17.                 if (xmlhttp.readyState==4 && xmlhttp.status==200){
  18.                         document.getElementById("wheat_scaf").innerHTML=xmlhttp.responseText;
  19.                 }
  20.         }
  21.         xmlhttp.open("GET","wheat_search.pl?q="+str+"&f="+flank,true);
  22.         xmlhttp.send();
  23. }
復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-04-30 10:56 來自手機(jī) |只看該作者
如果數(shù)據(jù)相對固定,可以事先分割大文件成N個(gè)小文件,建個(gè)索引,根據(jù)用戶輸入,根據(jù)索引直接讀取數(shù)據(jù)片段。速度慢不了

論壇徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-12-01 06:20:002015亞冠之首爾
日期:2015-11-04 22:25:43IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27獅子座
日期:2014-05-12 11:00:00辰龍
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-27 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-06-07 14:10:01
3 [報(bào)告]
發(fā)表于 2013-04-30 14:29 |只看該作者
本帖最后由 laputa73 于 2013-04-30 14:38 編輯

那個(gè)48G的電腦可以用嗎?

php+ redis

如果并發(fā) 不多,只追求速度,可以用一個(gè)app實(shí)例,用戶內(nèi)存hash也可以




才4G數(shù)據(jù),用文件太保守了

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2013-04-30 14:44 |只看該作者
mysql百萬級的數(shù)據(jù)絕對沒有問題。
我的想法:
1. 建個(gè)表,兩列: seq, data。seq做索引, 存700萬數(shù)據(jù)。
2. select data from xxx where seq = 'seq1'
3. 對data 取 substring

或者:
1. 建表,兩列: id, data.  id用bigint,自增做主鍵,存700萬數(shù)據(jù)
2. 用storable 以seq作鍵 id作值,保存一個(gè)hash。
3. 用seq找id 用id去mysql找data
4. 對data取substring

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-04-30 15:00 |只看該作者
你還有個(gè)48G內(nèi)存的機(jī)器。。。加個(gè)memcache或者php的apc還愁響應(yīng)慢? 簡單點(diǎn)就以seq作鍵把data存在緩存里就可以吧。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-04-30 19:20 |只看該作者
盡量讓數(shù)據(jù)庫不做額外的計(jì)算,先將客戶的長度需求做成索引,用PHP速度慢的話,CGI也快不了。所謂的 Storable and BerkeleyDB的查詢機(jī)制,都不如 mysql, 除非做成內(nèi)存數(shù)據(jù)庫。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2013-04-30 20:20 |只看該作者
Perlvim 發(fā)表于 2013-04-30 19:20
盡量讓數(shù)據(jù)庫不做額外的計(jì)算,先將客戶的長度需求做成索引,用PHP速度慢的話,CGI也快不了。所謂的 Storabl ...

這說的就太不對了
BerkeleyDB怎么可能查詢速度比MySQL慢?這就像說C++比C快一樣。早期的MySQL都是用BerkeleyDB實(shí)現(xiàn)的,關(guān)系型數(shù)據(jù)庫的優(yōu)勢是事務(wù),并發(fā),和一些特定情況下的查詢,關(guān)系型數(shù)據(jù)庫是永遠(yuǎn)不會有BerkeleyDB這種以排序二叉樹的實(shí)現(xiàn)快

樓主應(yīng)該考慮一下你用1分多鐘時(shí)間是花在哪了?實(shí)在不明白就看看執(zhí)行計(jì)劃。700萬的數(shù)據(jù)你用什么數(shù)據(jù)庫,只要加個(gè)索引,怎么都不應(yīng)該是1分鐘,但你的要在1M的字符串上定位一個(gè)片段,時(shí)間有可能花在這上了

我的意思是,你要先清除你這1分鐘是花在哪了,再用相應(yīng)技術(shù)改進(jìn)現(xiàn)有算法。我覺得你可以考慮搜索引擎的原理,用文件索引,對應(yīng)的產(chǎn)品可以看看ElasticSearch

論壇徽章:
1
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00
8 [報(bào)告]
發(fā)表于 2013-05-01 09:12 |只看該作者
回復(fù) 2# iamlimeng


    謝謝關(guān)注,問題已經(jīng)搞定。詳見修改后的原帖。

論壇徽章:
1
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00
9 [報(bào)告]
發(fā)表于 2013-05-01 09:13 |只看該作者
回復(fù) 3# laputa73


     謝謝關(guān)注,問題已經(jīng)搞定。詳見修改后的原帖。

論壇徽章:
1
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00
10 [報(bào)告]
發(fā)表于 2013-05-01 09:14 |只看該作者
回復(fù) 4# soul20040103


     謝謝關(guān)注,問題已經(jīng)搞定。詳見修改后的原帖。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP