2012-01-09 8 views
4

こんにちは、ありがとう! PLINQ使用時にメモリ例外を回避するにはどうすればよいですか?

背景には、私は多くの時間、または並列コンピューティングのいずれかが必要コンピューティングタスクを持っています。

具体的には、約50枚の画像のリストをループし、Base64でエンコードし、新たにエンコードされた各項目と、約2000 Base64の文字列でエンコードされた画像を含むXMLファイルの値との間のLevenshteinの距離を計算する必要があります。最小のLevを持つXMLファイル内の文字列を見つけます。ベンチマーク文字列からの距離。

定期foreachループ作品が、遅すぎるので、私は私のコアi7のマルチコアプロセッサを活用するためにPLINQを使用することを選択した:

Parallel.ForEach(candidates, item => findImage(total,currentWinner,benchmark,item)); 

タスクが高速で一緒にレースを、見事に開始します、しかし、私は "メモリ不足"例外を取得します。

私はC#、.NET 4、Forms Appを使用しています。

質問

私が利用可能なメモリが不足しないように、どのように私は私のPLINQコードを微調整するのですか?

private void btnGo_Click(object sender, EventArgs e) 
{ 
    XDocument doc = XDocument.Load(@"C:\Foo.xml"); 
    var imagesNode = doc.Element("images").Elements("image"); //Each "image" node contains a Base64 encoded string. 
    string benchmark = tbData.Text; //A Base64 encoded string. 
    IEnumerable<XElement> candidates = imagesNode; 

    currentWinner = 1000000; //Set the "Current" low score to a million and bubble lower scores into it's place iteratively. 

    Parallel.ForEach(candidates, i => { 
     dist = Levenshtein(benchmark, i.Element("score").Value); 
     if (dist < currentWinner) 
     { 
      currentWinner = dist; 
      path = i.Element("path").Value; 
     } 
    }); 
} 

:/サンプルコードここで

更新PLINQ foreachをiniateするために呼び出されるメソッドです。 。ここにLevenshtein距離法があります:

public static int Levenshtein(string s, string t) { 
      int n = s.Length; 
      int m = t.Length; 
      var d = new int[n + 1, m + 1]; 

      // Step 1 
      if (n == 0) 
      { 
       return m; 
      } 

      if (m == 0) 
      { 
       return n; 
      } 

      // Step 2 
      for (int i = 0; i <= n; d[i, 0] = i++) 
      { 
      } 

      for (int j = 0; j <= m; d[0, j] = j++) 
      { 
      } 

      // Step 3 
      for (int i = 1; i <= n; i++) 
      { 
       //Step 4 
       for (int j = 1; j <= m; j++) 
       { 
       // Step 5 
       int cost = (t[j - 1] == s[i - 1]) ? 0 : 1; 

       // Step 6 
       d[i, j] = Math.Min(
        Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), 
        d[i - 1, j - 1] + cost); 
       } 
      } 
      // Step 7 
      return d[n, m]; 
      } 

ありがとうございます!

+0

あなたのコードは表示されていません。現在の状況が分からない場合、どのように調整するべきかアドバイスできますか? – LukeH

+0

申し訳ありませんが、私は説明が適切だと思った。私はポストを更新します。ありがとう。 –

+0

@ LukeH-コードが追加されました。ありがとう! –

答えて

6

更新

さまざまな状況でこのエラーに再び遭遇します。私は、高いメモリ需要のデスクトップアプリケーションで作業していました。使用可能なすべてのメモリにアクセスするように64ビットアーキテクチャのプロジェクトを設定していることを確認してください。私のプロジェクトはデフォルトでx86に設定されていました。もちろん、これは、展開用に64ビットプロセッサを使用できる場合にのみ機能します。

エンド更新

これで少し苦労した後に、オペレータエラーと表示されます。

進捗ラベルを更新するために、私は並列スレッドからUIスレッドへの呼び出しを作っていたが、私はありませんでしたスレッドセーフな方法で実行します。

さらに、私はデバッガを使わずにアプリケーションを実行していたので、コードがオーバーフローの原因となった並列スレッドからUIスレッドを更新しようとするたびにキャッチされない例外が発生しました。

PLINQのエキスパートではないが、このような悪質なコードエラーを作らない限り、すべての低レベルの割り当てを処理すると思う。

これは他の人に役立つことを願っています。

関連する問題