私はプログラミングの問題に取り組もうと考えていますが、そのためには高度なプログラミングの概念をたくさん知る必要があると思います。いくつかの理由で、Java でコーディングすることにしました。したがって、提案、ガイダンス、リソースへのポインタ、本、チュートリアル、または関連すると思われる一般的なアドバイスを提供してください.
私の問題の基本的な性質は次のとおりです。
クライアント サーバー アーキテクチャを作成する必要があります。サーバーは複数の同時クライアントをサポートします。クライアントは単純な指示を送信し (サーバーはある種の API を公開し、特定のポートでリスナーを実行する場合があります)、サーバーは指示を実行し、結果をクライアントに送り返します。
サーバーの主な仕事は、与えられた指示に基づいて大量のデータ処理を行うことです。バックエンド データベース/ファイル システムからデータを取得します。データ量は、最大 200GB ~ 700GBまで簡単に急増する可能性があります。通常、データはそこにストリーミングされますが、処理中に大量のデータをメモリ キャッシュに保持する必要がある場合があります (RAM が十分でない場合は、ディスクにページングします)。計算は一般的に本質的に数値集約的です (行列の逆数を取るとしましょう)
サーバーはマルチスレッドを実行できる必要があります(この用語が Java で何を意味するのかわかりませんが、私が望むのは、サーバーがジョブを複数の並列サブプロセスに分散できる必要があるということです)。
サーバー自体は非常に軽量でなければなりません。GUIインターフェイスは必要ありません。
後でHadoopなどの HPC フレームワークと統合できるように設計できれば素晴らしいと思います。
もし私がこれをしなければならないとしたら、どのようなプログラミングを学ばなければならないのでしょうか? ところで、私は OOP について十分に理解しています。データ構造とアルゴリズムにある程度精通しており、基本的な Java を知っています (これまで Java でネットワークまたはマルチスレッド プログラミングを行ったことはありませんが、典型的な OOP の概念、ジェネリック、同等のインターフェイスなどを使用したことがあります。 )。私は基本的にデータベース プログラミングの仕事をしていますが、過去に C、C++、C#、Python もたくさんやったことがあります。
要件と私の経歴を考慮して、提案してください。
- このプロジェクトの作業をどのように開始すればよいですか? プロジェクトを設計する方法は何ですか?
- 最初にいくつかの基本的な API 定義を作成してから、詳細に取り掛かる必要がありますか?
- 特定の設計パターンに従う必要がありますか? それらをどこから学べますか?
- Java で学ぶ必要があることは何ですか? どこから学べますか?
- メモリ内の巨大なデータを読み取る最良の方法は何ですか? Java nio は良い解決策ですか?
- 大量のデータを持つクラスをインスタンス化すると、うまくいきますか? (たとえば、数百万の要素を持つ行列を表す Vector クラスがあり、クラスのコンストラクターがメモリ内の膨大なデータセットを読み取るとします)。それを処理する最良の方法は何ですか?