データベースとクロスチェックされる膨大な量の受信メールからキーワードを抽出するClojureを使用して、並行プログラムを作成します。
私のチームメイトの1人がこのプログラムを書くためにErlangを使うことを提案しました。
ここで、私が関数型プログラミングに不慣れなことに気づきたいので、このプログラムを書くのにclojureが適しているのか、それともErlangが適しているのか、少し疑問があります。
2つの言語とランタイムは、並行性に対して異なるアプローチをとります。
Erlangは、相互に通信する多くの軽量プロセスとしてプログラムを構築します。この場合、多くのワーカーにジョブとデータを送信するマスタープロセスと、結果のデータを処理するためのより多くのプロセスがあります。
Clojureは、いくつかのスレッドが共通のデータ構造を使用してデータと状態を共有する設計を支持しています。これは、多くのスレッドが同じデータにアクセスし(読み取り専用)、変更可能な状態がほとんどない場合に特に適しています。
アプリケーションを分析して、最適なモデルを判別する必要があります。これは、使用する外部ツールにも依存します。たとえば、データベースが同時リクエストを処理する機能などです。
別の実用的な考慮事項は、clojureが多くのオープンソースライブラリが利用可能なJVMで実行されることです。
本当に同時または分散を意味しますか?
同時実行(マルチスレッド、マルチコアなど)を意味する場合は、Clojureが自然な解決策だと思います。
分散を意味している場合(つまり、ネットワーク上で分離されたプロセスとして効果的に実行されている多くの異なるマシンが作業を共有している場合)、Erlangがより自然な解決策だと思います。
長期的には、ClojureがErlangと一致する分散コンピューティングフレームワークを開発してくれることを願っています。そうすれば、両方の長所を手に入れることができます。
Clojureは、Java JVMで実行されているLISPです。Erlangは、高度にフォールトトレラントで同時実行できるようにゼロから設計されています。
タスクはこれらの言語のいずれかと他の多くの言語でも実行可能だと思います。経験は、問題をどの程度理解しているか、言語をどれだけ理解しているかによって異なります。あなたが両方に不慣れな場合、どちらを選択しても問題は難しいと思います。
Lucene/Solrのようなものについて考えましたか?ドキュメントのインデックス作成と検索に最適なソフトウェアです。あなたのコンテキストにとって「クロスチェック」が何を意味するのかはわかりませんが、これは考慮すべき良い解決策かもしれません。
私のアプローチは、各言語で簡単なテストを記述し、それぞれのパフォーマンスをテストすることです。どちらの言語もCスタイルの言語とは多少異なり、慣れていない場合(そして慣れているチームがない場合)は、メンテナンスの悪夢に終わる可能性があります。
Groovy 1.8のようなものを使用することも検討します。 Groovyには、並列計算を可能にするGParsが含まれています。 Groovyでの文字列とファイルの操作は非常に簡単です。