大量のデータを処理する低カップリング


8

通常、それらの間でリスト、セット、およびマップを交換するクラスを作成することにより、低結合を実現します。現在、Javaバッチアプリケーションを開発していますが、十分なメモリがないため、すべてのデータをデータ構造内に配置できません。データの1つのチャンクを読み取って処理し、次のチャンクに進む必要があります。したがって、読み取るデータがまだあるかどうかなどをどこかで確認する必要があるため、カップリングを低くすることははるかに困難です。

私が今使っているのは:

ソース->プロセス->持続

処理するクラスは、読み込む行がまだあるかどうかをソースクラスに問い合わせる必要があります。

そのような状況でのベストプラクティスや有用なパターンは何ですか?

私に言わなければ、自分自身を説明しているといいのですが。


3
低結合を実現する方法の1つは、ソースクラスとプロセスクラス間の通信の適切なプロトコルを確立することです
ツリーコーダー

3
メッセージキュー(ある種のデータバス)を使用して、クラスが直接対話するのではなく、キューにデータを入れ、それらをキューからプルすることを検討したいと思うかもしれません。
Murph

@マーフはメッセージキューを使用するための簡単な方法または優れたJavaライブラリはありますか?
ВиталийОлегович

@vitalik-私は.NET開発者であり、メッセージキューを自分のやり方で感じているので、自信に満ちた回答を提供する立場にありません(そのため、私の回答はコメントすることになります)
Murph

1
@マーフ大丈夫、とにかくありがとう!キューの勉強も始めますね!
ВиталийОлегович

回答:


7

コメントから、Javaを使用していることがわかります。さまざまなキューの実装をご覧ください。特に、BlockingQueueプロデューサー/コンシューマーシナリオに役立ちます。2つのキューを使用できます。1つはソース(データのプロデューサー)とProcess(データのコンシューマー)の間、もう1つはProcess(結果のプロデューサー)とPersist(結果のコンシューマー)の間です。

容量が制限されたブロッキングキューを使用すると、効率的な(ボトルネック部分は何であれ、100%の時間データが供給され続ける)システムを実装するのがかなり簡単です。


あなたの解決策はとても良いです。しかし、制限された容量のキューを使用していて、キューがいっぱいで、何かを追加しようとするとどうなりますか?
ВиталийОлегович

@vitalik次に、メモリDBに一時的にデータを格納する、または他のそのようなソリューションをディスクに保存するなどの戦略を導入する必要があります。
Martijn Verburg

@MartijnVerburgはい、でも、キューに空いているスペースができるまでプロデューサーをスリープさせる可能性があればもっと簡単だと思います。
ВиталийОлегович

1
@vitalikはもちろん可能性があります(プロデューサーをスリープ状態にするため)。一部のキューはブロックするように構成できます。これにより、プロデューサーがフルキューに挿入しようとした場合、ブロックするだけで、キューのスペースを確保するためにスリープ/スピン(どちらに注意するか)を効果的に行うことができます。
sdg

1
@vitalik:BlockingQueue.put docsなどを参照:指定された要素をこのキューに挿入し、必要に応じてスペースが利用可能になるまで待機します。シンプルで便利!:)
Joonas Pulakka

2

(Joonas Pulakkaからの)ブロッキングキューは、強力な答えです。より簡単な答えがうまくいくかもしれません。すべてのデータがソースに保存されている場合は、参照をプロセッサに渡すだけで、ソースからデータを取得できます。もちろん、これはおそらくあなたが過去にやっていたことです。ソース内のメモリにすべてのデータが含まれておらず、必要な低カップリングが得られない場合があります。

次のステップは、列挙子または反復子インターフェースを使用することです。(イテレータはJavaでより一般的ですが、ほとんどの場合、そのremoveメソッドは単なるニュアンスです。)プロセッサはソースからイテレータを取得し、完了するまでメソッドを呼び出します。ソースがテラバイト単位のデータをどこかからプルしている場合、呼び出しごとに時間がかかる場合があります。しかし、とにかくキューに何かが入るまでプロセッサをスリープさせる場合、これは自動的にそれを行うだけです。ソースが先プロデューサーの取得する場合と、ソースを自動的に呼び出すためのプロデューサーを待つことになるhasNextnext

一方、あなたはからデータをつかんソースたい場合は、そのことができるようにして、プロセッサが追いつくまで、それを備蓄速いようなソースではないし、複数のthreads-- -プロセスのプロセッサは、キューを待って周りに座っをより複雑な場合、良いアイデアのように見え始めます。これで、ソースは実行速度が速くなるとデータを積み重ねることができ(その制限はおそらくディスクI / Oのようなものです)、プロセッサは実行速度が高くなるパイルのサイズを縮小できます(制限は永続性の速さです)モジュールはデータを永続化できます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.