2017-07-05 8 views
-2

ありR言語で文字列比較が遅すぎる

文字列比較がR言語で遅すぎる。 3分かかりますが、遅すぎます。文字列が長い場合は時間がかかります。文字列を高速比較する方法はありますか?ありがとう!

date() 
    strArray1<-rep("1234567890",10000) 
    strArray2<-rep("1234567890",10000) 
    tt<-0 
    for(xx in 1:10000) 
    { 
     for(yy in 1:10000) 
     { 
      if(strArray1[xx]==strArray2[yy]) 
      { 
       tt<-tt+1 
      } 

     } 

    } 
    date() 

UPDATE:

a.txt (>10000 lines): 
abc00001 
abc00035 
abc15747 
.... 

B.TXT(> 50000行):

実際には次のように、私は、2つのファイルを持っているA.TXTを言うとB.TXT
abc00001 blablabla... 
abc00002 blablabla... 
abc00003 blablabla... 
abc00004 blablabla... 
.... 
abc60000 blablabla... 

私がしたいのは、b.txtから行を抽出することです。 a.txtのIDを含む行が抽出されます。これは数千の文字列を比較し、長い時間がかかります。それ自体

+2

これはコメントですか、質問ですか?私はRを見たことがありませんが、見た目からは10000x10000倍の文字列(100,000,000回の比較)を比較しようとしています。それはほとんどのプログラミング言語では「遅い」でしょう。 – Neil

+0

あなたのネストされたforループはこれを行うことができるすべての言語で遅くなります –

+0

私はあなたに同意しないでしょう。 CまたはPerlを使用する場合は、おそらく1分未満を使用します。私はCを使って1億個以上の文字列を処理していましたが、非常に高速でした。 – EmanLee

答えて

1

文字列の比較はひどく遅いではありません。

> v <- rep("1234567890",100) 
> microbenchmark(v=="1234567890") 
Unit: nanoseconds 
       expr min lq mean median uq max neval 
v == "1234567890" 0 355 1006.05 355 709 39639 100 

表現v == "1234567890"は評価するために、100回の文字列比較が必要です。これを行う平均時間は1000ナノ秒であり、そのような比較のために(私のマシン上では)平均で10ナノ秒かかることを意味する。これは、長さ10の文字列の場合はかなり速いです。一方、Rのforループは非常に遅いです。コードをベクトル化する方法を見つけ出す必要があります(これは、解釈されたRではなく最適化されたCで暗黙のループを実行します)。例えば

、次のベクトルのコード(コードとしてttの同じ値を計算する)1秒未満で実行:

print(date()) 
strArray1<-rep("1234567890",10000) 
strArray2<-rep("1234567890",10000) 
tt<-sum(sapply(strArray1,function(s){sum(strArray2 == s)})) 
print(tt) 
print(date()) 

ダウトレスsapplyを使用するソリューションであるため、それはさらに良く向上させることができ頻繁に最適ではない。