0

ファイル (8 億行を含む) を 1 行ずつ読み取り、データを処理 (非常に軽い処理、基本的に文字列の書式設定) し、処理された行を別のファイルに書き込むとします。

ファイルから読み取った 100 万行ごとにステートメントを出力する場合、基本的な方法は、反復変数をチェックする if ステートメントを追加し、% million == 0 ごとにステートメントを出力することです。

さて、このコードは、インデックスが次の 100 万に達したかどうかをすべての反復でチェックします。これは、すべての反復で追加の処理ですよね?

反復インデックス変数が数百万の倍数に達した場合にのみ、何らかのシグナルが送信され、ステートメントが出力されるように、これを行う効率的な方法は他にありますか?

4

4 に答える 4

3

さて、このコードは、インデックスが次の 100 万に達したかどうかをすべての反復でチェックします。これは、すべての反復で追加の処理ですよね?

正しい

反復インデックス変数が数百万の倍数に達した場合にのみ、何らかのシグナルが送信され、ステートメントが出力されるように、これを行う効率的な方法は他にありますか?

いいえ、ありません1

しかし、これが「非効率」であることを心配しないでください。テストのコストは、データの読み取りと処理のコストよりも2 桁以上少ない可能性が高いです。

1 - リフレクションでは、状況によっては、専用カウンターをデクリメントし、それがゼロかどうかをテストする方が効率的かもしれません。また、カウンターがオーバーフローした場合、「%」アプローチは適切に機能しません。


一般的なアドバイス。ボトルネックがあるという証拠がない限り、このレベルでの「最適化」に時間を費やさないでください。アプリケーションのこの側面を最適化する価値があるかどうかを判断できるように、実際のデータを使用してアプリケーションをプロファイリングする必要があります。

于 2013-03-21T12:29:34.563 に答える
3

私のマシンでは、次の処理に 1.4 秒かかります。

    for (int i = 0; i < 800000000; ++i) {
        if (i % 1000000 == 0) {
            System.out.print('.');
        }
    }

これは、あなたが元気であることを示しています。ただし、疑わしい場合は、プロファイルを作成してください。

于 2013-03-21T12:29:52.630 に答える
1

線形解が必要な場合、Stephen Cが言ったように最適な方法は不可能です。

しかし、並列処理について話すとき、最適な解決策があります。

たとえば、別のプロセッサで動作している別のスレッドが反復プロセスの状態にアクセスできる場合、反復プロセスを中断することなく、特定の時点でのステータスを知ることができます。

ステータスを印刷すると、並列処理フロー\プロセッサを介して外部スレッドによって実行されるため、反復プロセスΘ(0)のコストがかかるため、これも最適です。

お役に立てれば

于 2013-03-21T14:21:59.407 に答える
0

8億行のテキストデータがあり、処理してから単一のTextFileにコピーする必要があります

  • あなたの場合は 1M であるパブリックパラメーター「NotifyAfter」をお勧めします。
  • 次に、必要に応じて、8 億行を {NotifyAfter} のバッチに分割し、それらを {Start,End} を使用して配列またはキューに格納できます。
  • これで、いくつかのスレッドを生成できます。すべて同じファイルから読み取るため、ここでレース/デッドロックに注意する必要があります。
  • その後、各サブプロセスはその作業を完了し、イベントを発生させます - TaskComplete (処理された行数を増やします)
    • ここで決定する必要があります-スレッドがすべてを小さなファイルに書き込み、それらをつなぎ合わせるかどうか
    • または、コードを同期して同じファイルに書き込むことができます。

私はスティーブンに同意します-ボトルネックの証拠がない限り、最適化しないでください

お役に立てれば !!

于 2013-03-21T13:17:42.653 に答える