2009-08-06 16 views
0

ArcViewと統合するArcGISのカスタムツールを開発中です。このツールはC#を使用して開発され、基本的にSQLデータベースに接続し、ローカルデータ構造にデータをフェッチし、統計分析を行い、その結果を新しいレイヤーとして表示します。ArcGIS C#のメモリ割り当てのクラッシュ

このコードの実行中にクラッシュが発生します。

LinkedList<SegmentDbRecord> segmentData = new LinkedList<SegmentDbRecord>(); 
while(dataReader.Read()) 
{ 
    SegmentDbRecord record = new SegmentDbRecord(); 

    record.first_stop_id = dataReader.GetInt32(0); 
    record.first_stopway = dataReader.GetString(1); 
    record.first_stopway_X = dataReader.GetString(2); 

    record.second_stop_id = dataReader.GetInt32(3); 
    record.second_stopway = dataReader.GetString(4); 
    record.second_stopway_X = dataReader.GetString(5); 

    record.segment_start = Tools.timeToFloat((DateTime)dataReader.GetValue(6)); 
    record.segment_finish = Tools.timeToFloat((DateTime)dataReader.GetValue(7)); 

    record.stop1_long = dataReader.GetFloat(8); 
    record.stop1_lat = dataReader.GetFloat(9); 
    record.stop2_long = dataReader.GetFloat(10); 
    record.stop2_lat = dataReader.GetFloat(11); 

    record.max_speed = dataReader.GetInt32(12); 
    record.avg_speed = dataReader.GetInt32(13); 
    record.route_hnd = dataReader.GetInt32(14); 
    record.seq_1 = dataReader.GetInt32(15); 
    record.seq_2 = dataReader.GetInt32(16); 
    record.route_name = dataReader.GetString(17); 

    segmentData.AddFirst(record); 

} 

この段階では、クエリの結果をリンクリストに保存しています。私はかなりメモリの割り当て中にクラッシュが発生したと確信していますが、私はまだ十分なメモリが残っていることを知っているクエリは、そのような大きなデータセットを返していません。新しい "レコード"を割り当てる単純なループを実行すると、非常に高速にクラッシュします。 ArcGISランタイムの組み込み保護について知っている人がいますが、これにより特定のメモリ量以上の割り当てができなくなる可能性があります。

ありがとうございました!

+0

このコードでは、ArcGISに関連するものはありません。それがArcGISの問題だとあなたはどうして確信していますか?あなたが得ている正確なエラーメッセージは何ですか? –

+0

Throwされている例外のToString()を表示することができれば助けになります。 –

+0

次のメッセージでArcGISからクラッシュしました。 「ArcGIS Desktopに重大なアプリケーションエラーが発生し、処理を続行できません」 エラーメッセージを送信するように促すメッセージはありません。私は "ダンプ"ファイルを取得しますが、それは使用可能に見えません。 –

答えて

0

データ変換に問題がある可能性があります。

record.max_speed = dataReader.GetInt32(12); 
  • INT32をMAX_SPEEDです。たとえばラインを取りますか?
  • 位置12のフィールドはint32に変換できる値ですか?

あなたができることは、値を割り当てるすべての行をコメントアウトし、実行されているかどうかを確認してから、行を1つずつ追加してエラーの原因を調べます。問題は、LinkedListのの使用に起因しているようにコメントをもとに

EDIT

が見えます。 Listを使わないのはなぜですか?

+0

割り当てコードなしで問題が引き続き表示されます。メモリを割り当ててリストにレコードを追加するだけで、プログラムをクラッシュさせることができます。 –

+0

あなたはここで何件のレコードについて話していますか? –

+0

17969レコードを割り当てた後にクラッシュしました。 これは約1 MBのデータです。 –

0

ArcMapは、ユーザーが追加したコンポーネントからの例外を静かに呑み込んでいます。コード内で発生した例外はすべてトラップして処理します。

簡単なトラブルシューティングの手法は、次のようなものでコードブロック全体をラップで構成されています

try { 
    ... 
} catch (Exception ex) { 
    MessageBox.Show(ex.ToString()); 
    throw; 
} 

うまくいけば、あなたが有益なメッセージが表示されます。

+0

残念ながら、例外はスローされません... –

0

私たちは、Arc GISの長年にわたる奇妙なクラッシュの問題を抱えていました。最終的に、ディスク・クォータがArcGISアカウントのサーバー側で有効になっていることがわかりました。クォータを削除すると問題が解決しました。

おそらく、他の何かが動いていない場合は、それを試すことができます。

+0

私はあなたが話しているサーバーを理解していません。 –

+0

私はamazedsaintがArcMapではなくArcGIS Serverについて話していると思います。 –

+0

まあ、Arc GISサーバー – amazedsaint

0

私が見つけた解決策は、すべての処理を別のスレッドで行うことです。私のツールが構造化されているように、ボタンイベントは「ジョブハンドラ」にコマンドを送信していました(それを呼びます、私は私のオリジナルの内部クラス名を共有しません)。他の仕事が予定されていた)。メモリ割り当てには時間がかかりすぎていたため、ArcGISはCOM DLLを応答しないと考えていたため、何も表示せずに単にクラッシュして状況を処理していました。

皆さんありがとうございました。