科学計算はアルゴリズム集約的であり、データ集約的でもあります。多くの場合、分析を実行し、次の作業に進む前に解放するために大量のメモリを使用する必要があります。また、メモリプールを使用して、各分析のメモリをリサイクルすることもあります。ここでマネージド言語が興味深いのは、開発者がアプリケーション ロジックに集中できるからです。巨大なデータセットを扱う必要があるかもしれないので、パフォーマンスも重要です。しかし、マネージ言語を使用してメモリとパフォーマンスを制御するにはどうすればよいでしょうか?
12 に答える
Pythonは、最近の科学計算でかなり大きくなっています。これはマネージ言語であるため、メモリを解放することを覚えておく必要はありません。同時に、科学計算および数値計算 ( NumPy、SciPy ) 用のパッケージがあり、コンパイル済み言語と同様のパフォーマンスが得られます。また、Python は C コードと非常に簡単に統合できます。
Python は非常に表現力豊かな言語であり、多くの従来の言語よりも読み書きが容易です。また、いくつかの点で MATLAB に似ているため、C++ や Fortran よりも科学者にとって使いやすくなっています。
オスロ大学は最近、情報学科以外のすべての理系学生 (まだ Java を学んでいる学生) のデフォルト言語として Python を教え始めました。
科学計算や偏微分方程式などに深く関わっているSimula Research Laboratoryでは、pythonを多用しています。
あなたは根本的に欠陥のある質問をしています。マネージ言語の要点は、メモリを処理しないことです。これはガベージ コレクターによって処理されますが、ガベージ コレクターがより効率的にジョブを実行できるようにするために特定のアクションを実行することはできますが、そのジョブを実行するのはユーザーの仕事ではありません。
パフォーマンスをコントロールできない世界で、パフォーマンスを向上させるためにできることは単純です。必要のない参照を保持しないようにしてください。状況をより詳細に制御する必要がある場合は、スタックベースの変数を使用してください。
F# seems to be somewhat targeted at this audience. There is actually a book called F# for scientists.
Also this question was asked over at Lambda the Ultimate.
これに Matlab を使用する人の数に驚くかもしれません。Matlab はプログラミング言語と見なすことができ、(巨大なデータ セットのサポートなどによって) 独自のメモリを確実に管理するため、ここでは解決策として真剣に検討する必要があります。 .
さらに、プログラム コードを生成するので (別のプラグインが必要になる場合がありますか?)、パッケージ化したいアルゴリズムにたどり着いたら、M スクリプトまたは simulink モデルで最初に行った作業を実行する C コードを生成することができます。
-アダム
質問の内容は正確にはわかりませんが、フォートレスをチェックしてみてください。
この質問を言い換えると、.NET メモリ マネージャーは、特に非常に大きな (GByte) 行列のメモリ パフォーマンスを向上させるために伝統的に手作業で調整されたルーチンが使用されてきた科学計算のメモリ管理の仕事を処理できるでしょうか?
他の人が指摘しているように、マネージ コードの主なポイントは、メモリ管理タスクを自分で処理する必要がないことです。アルゴリズムに集中できるため、これは大きな利点です。
Oberonmicrosystemsによって開発されたBlackBoxComponentBuilderは、プログラミング言語「ComponentPascal」のコンポーネントベースの開発環境です。
BlackBoxは、その安定性、パフォーマンス、およびシンプルさにより、科学およびエンジニアリングアプリケーションに最適です。
http://www.oberon.ch/blackbox.html
(開示:私はOberonマイクロシステムで働いています)
よろしく、タンバーグ
最適なオプションは、NumPy/SciPy/IPython を使用した Python です。高度に最適化された C および Fortran で記述されたライブラリでコア計算が行われるため、優れたパフォーマンスが得られます。Python を使用して対話するため、視点から見るとすべてがクリーンであり、非常に簡潔で読みやすいコードとガベージ コレクションで管理されます。
簡単に言えば、適切な言語 ( OCamlやF#など) を選択し、その言語で最適化する方法を学習することで、マネージ言語で記述されたプログラムのメモリとパフォーマンスを制御できるということです。長い回答には、科学者向けの OCamlやテクニカル コンピューティング向けの Visual F# 2010など、使用している特定の言語に関する本が必要です。
学習する必要がある主題は、アルゴリズムの最適化、低レベルの最適化、データ構造、および選択した言語での型の内部表現です。並列アルゴリズムを作成している場合は、キャッシュについて学ぶことも特に重要です。
I would think that functional languages would be best suited to this type of task.
.NET アプリケーションは、そのオーバーヘッドのために、管理されていないアプリケーションに比べてパフォーマンスが低下します。ただし、このオーバーヘッドは多かれ少なかれアプリケーションの全体的なサイズとは関係のない定数であるため (警告: 過度の単純化)、アプリケーションが大きくなればなるほど、ペナルティは比較的少なくなります。
したがって、私は .NET を使用します (必要なライブラリが提供される限り)。記憶を管理するのは苦痛であり、上手になるためにはたくさんのことをしなければなりません。.NET 内では、J# や VB.NET ではなく、C# である限り、最も快適な言語を選択してください。
マネージ言語を使用すると、その制御を簡単に行うことはできません。これらの言語の要点は、malloc やガベージなどを処理することです。マネージ言語ごとに、異なる方法で処理されます。
Perl では、メモリ不足は致命的なエラーと見なされます。$^M を使用して小さな手段で時間を節約できますが、これは、コンパイラがその機能を使用してコンパイルされており、そのためのコード規定を追加している場合のみです。