2017-07-21 1 views
0

がかかる私は、次のされておよそ10mlの液体フッ化水素を圧入277270行、 私のクラスTripleIntsでTripleIntsの3本の一覧を書いています:のファイルの書き込みが時間

class tripleInt (var sub:Int, var pre:Int, var obj:Int) 
追加

私はRDFファイルからApacheのイエナコンポーネントと各リストを作成します私はRDF要素をIDに変換し、このIDを別のリストに格納します。リストを取得したら、次のコードを使ってファイルを書きます:

class Indexes (val listSPO:List[tripleInt], val listPSO:List[tripleInt], val listOSP:List[tripleInt]){ 
    val sl = listSPO.sortBy(l => (l.sub, l.pre)) 
    val pl = listPSO.sortBy(l => (l.sub, l.pre)) 
    //val ol = listOSP.sortBy(l => (l.sub, l.pre)) 

    var y1:Int=0 
    var y2:Int=0 
    var y3:Int=0 

    val fstream:FileWriter = new FileWriter("patSPO.dat") 
    var out:BufferedWriter = new BufferedWriter(fstream) 
    //val fstream:FileOutputStream = new FileOutputStream("patSPO.dat") 
    //var out:ObjectOutputStream = new ObjectOutputStream(fstream) 
    //out.writeObject(listSPO) 
    val fstream2:FileWriter = new FileWriter("patPSO.dat") 
    var out2:BufferedWriter = new BufferedWriter(fstream2) 
    /*val fstream3:FileOutputStream = new FileOutputStream("patOSP.dat") 
    var out3:BufferedOutputStream = new BufferedOutputStream(fstream3)*/ 

    for (a <- 0 to sl.size-1){ 
    y1 = sl(a).sub 
    y2 = sl(a).pre 
    y3 = sl(a).obj 
    out.write((y1.toString+","+y2.toString+","+y3.toString+"\n")) 
    } 
    for (a <- 0 to pl.size-1){ 
    y1 = pl(a).sub 
    y2 = pl(a).pre 
    y3 = pl(a).obj 
    out2.write((y1.toString+","+y2.toString+","+y3.toString+"\n")) 
    } 
    out.close() 
    out2.close() 

このプロセスには30分のaproxがかかります。私のPCは16GBのRAM、コアi7です。それから、なぜ時間がかかっているのか理解できず、このパフォーマンスを最適化する方法はありますか?

はい、あなたが賢くあなたのデータ構造を選択する必要があり、あなたに

+0

こんにちは、私はあなたが私の答えを見たことは確かではありませんが、はいの場合:主な問題であるSeqの索引付けが行われましたか?それを修正して実行時間を短縮しましたか? –

答えて

1

ありがとうございます。 Listは、ランダムアクセス(IndexedSeq)ではなく、順次アクセス(Seq)用です。あなたが何をしているのは、大きなインデックスを付けているので、O(n^2)です。List以下は、はるかに高速(あまりにも読みO(n)とうまくいけば簡単に)する必要があります:

class Indexes (val listSPO: List[tripleInt], val listPSO: List[tripleInt], val listOSP: List[tripleInt]){ 
    val sl = listSPO.sortBy(l => (l.sub, l.pre)) 
    val pl = listPSO.sortBy(l => (l.sub, l.pre)) 

    var y1:Int=0 
    var y2:Int=0 
    var y3:Int=0 

    val fstream:FileWriter = new FileWriter("patSPO.dat") 
    val out:BufferedWriter = new BufferedWriter(fstream) 

    for (s <- sl){ 
    y1 = s.sub 
    y2 = s.pre 
    y3 = s.obj 
    out.write(s"$y1,$y2,$y3\n")) 
    } 
    // TODO close in finally 
    out.close() 

    val fstream2:FileWriter = new FileWriter("patPSO.dat") 
    val out2:BufferedWriter = new BufferedWriter(fstream2) 

    for (p <- pl){ 
    y1 = p.sub 
    y2 = p.pre 
    y3 = p.obj 
    out2.write(s"$y1,$y2,$y3\n")) 
    } 
    // TODO close in finally 
    out2.close() 
} 

(これは、入力としてIndexedSeq/Vectorを使用して傷つけないだろうが、Listはあなたに好まれている理由な制約があるかもしれませんケース。)

関連する問題