-1

パフォーマンスの観点からは、XML ファイルから大量のデータを読み取るか、配列をループ処理する方が有益ですか?

ループして計算する必要がある約 2,000 のデータセットがあるので、すべての XML データをインポートして配列として処理する (単一の大きなインポート) か、各データセットを順番にインポートする (多くの少量の輸入品)。

考えや提案は?

4

1 に答える 1

1

あなたの質問を正しく解釈した場合、1 つのファイルから 2,000 セットのデータをロードし、それらすべてを処理する必要があります。したがって、すべてのデータを読み取り、すべてのデータを処理する必要があります。基本的なレベルでは、同じ量の作業を行う必要があります。

そこで「どうすれば同じ処理を早く終わらせられるか」が問われると思います。

検討:

データはどのくらいのメモリを使用しますか? 1.5GB を超える RAM になる場合、32 ビット PC では 1 回のパスで処理することができず、64 ビット PC でも、仮想メモリのページングによってパフォーマンスが低下する可能性があります。 . いずれの場合も、データを小さなチャンクでストリーミングすることが必要です。

逆に、データが小さい場合 (たとえば、2000 レコードは、私が知る限り 200kB しかない可能性があります)、1 つのチャンクで読み取ることで I/O パフォーマンスが向上するか、処理時間と比較して非常に高速にロードされます。最適化しようとしても意味がありません。

レコードは独立していますか? (したがって、特定の順序で処理する必要はなく、別のレコードを処理するためにメモリ内に 1 つのレコードを存在させる必要もありません)アプローチ、操作を並列化することです。バックグラウンドでより多くのデータをロードしている間に一部のデータを処理できる場合、ハードウェアをより有効に活用し、同じ作業をより短い時間で実行できます。そのため、読み込みと処理を別のスレッドに分割することを検討することをお勧めします。

ただし、ロードが処理よりもはるかに長い場合、処理を多くのスレッドに分散しても役に立たない可能性があります。I/O を待っている間に処理スレッドのデータが不足する可能性があるためです。したがって、1 つの処理スレッドを使用しても、3 つまたは 7 つを使用した場合と同じくらい高速になる可能性があります。 . また、使用可能な CPU コアよりも多くのスレッドを作成しても意味がありません。マルチスレッド化する場合は、構成可能な/動的な数のスレッドを使用するように記述し、テストを行って最適なアプローチが何であるかを判断します。

しかし、そのすべてを検討する前に、ブルート フォース アプローチを作成して、パフォーマンスがどのようなものかを確認することを検討してください。最適化する必要さえありますか?

答えが「はい、どうしても最適化する必要がある」場合は、データ形式を再考できますか? XML は非常に便利なフォーマットですが、非常に非効率的です。パフォーマンスが重要な場合、XML サイズを小さくするためにできることはありますか (たとえば、単純に短い要素名を使用すると、大きなファイルでは大きな違いが生じる可能性があります)、またはよりコンパクトで読みやすいバイナリ形式を使用することさえできますか?

于 2013-05-17T22:23:57.737 に答える