5

与えられた生データのセットからいくつかの科学的結果を抽出するためのデータ処理ツールを開発しています。データサイエンスでは、結果を再取得して計算を繰り返すことができ、それが結果セットにつながることが非常に重要です。

ツールは進化しているため、ツールのどのリビジョン/ビルドが特定の結果セットを生成したか、およびツールがビルドされた対応するソースを見つける方法を見つける方法が必要です。

このツールはC++とPythonで書かれています。Boost::Pythonを使用してC++パーツを接着します。Linux用のMakeファイルを生成するビルドシステムとしてCMakeを使用します。現在、プロジェクトはSubversionリポジトリに保存されていますが、すでにgitrespを使用している人もいます。hgと私たちは、非常に近い将来、プロジェクト全体をそのうちの1つに移行することを計画しています。

このようなシナリオで、ソースコード、バイナリ、結果セットの間で一意のマッピングを取得するためのベストプラクティスは何ですか?

私たちがすでに議論しているアイデア:

  • どういうわけかグローバルリビジョン番号を注入します
  • ビルド番号ジェネレーターの使用
  • 実行可能ファイル自体の中にソースコード全体を保存する
4

2 に答える 2

3

これは私がかなりの時間をかけて取り組んでいる問題です。@VonCがすでに書いたものに、いくつかの考えを追加しましょう。

ソフトウェア構成管理のトピックはよく理解されており、多くの場合、商用環境で注意深く実践されていると思います。ただし、この一般的なアプローチは、多くの科学データ処理環境に欠けていることが多く、その多くは学界にとどまっている、または学界から成長しています。ただし、このような作業環境にいる場合は、すぐに利用できる情報やアドバイスのソース、および役立つツールがたくさんあります。これについてはこれ以上詳しく説明しません。

ソースコード全体を実行可能ファイルに含めるという提案は、実現可能であっても必要ではないと思います。実際、SCMを正しく取得した場合、それを実行し続けている重要なテストの1つは、「古い」実行可能ファイルをオンデマンドで再構築する機能です。また、各実行可能ファイルとバージョンで使用されたソースのリビジョンを判別できる必要があります。これらにより、実行可能ファイルにソースコードを含める必要がなくなります。

結果セットを計算に結び付けるというトピックも、あなたが言うように、不可欠です。構築しているソリューションのコンポーネントの一部を次に示します。

多くの科学プログラムの出力の特徴である従来の非構造化テキストファイルから構造化ファイルに移行しています。この場合、対象のデータとメタデータの両方を含むHDF5とXMLを調べています。保存されています。メタデータには、結果を生成するために使用されたプログラム(およびバージョン)の識別、入力データセットの識別、ジョブパラメーター、およびその他の多くのものが含まれます。

結果を保存するためにDBMSを使用することを検討しました。私たちはこのように行きたいのですが、今年はそれを行うためのリソースがありません。おそらく次の年もそうではありません。しかし、企業はさまざまな理由でDBMSを使用しています。その理由のひとつは、ロールバックして監査証跡を提供する機能などです。

また、どの結果セットを保存する必要があるかについても詳しく調べています。優れたアプローチは、フィールドセンサーからキャプチャされた元のデータセットを保存することだけです。残念ながら、一部の計算では生成に数千時間のCPU時間がかかるため、オンデマンドでそれらをab-initioで再現することは不可能です。ただし、将来的には、これまでよりもはるかに少ない中間データセットを保存する予定です。

また、ユーザーが結果セットを直接編集することを非常に難しくしています(不可能だと思いますが、まだそこにあるかどうかはわかりません)。誰かがそうすると、世界のすべての来歴情報は間違っていて役に立たなくなります。

最後に、このトピックについて詳しく知りたい場合は、「科学的なワークフロー」と「データの出所」に類似したトピックについてグーグルで試してみてください。

編集:私が上で書いたことからは明らかではありませんが、プログラムを変更して、プログラムに独自のIDが含まれるようにし(Subversionのキーワード機能を使用して、独自の拡張機能を1つまたは2つ使用しています)、生成される出力にこれを書き込みます。

于 2010-07-15T13:08:37.297 に答える
1

hgsubreposのgitサブモジュールを検討する必要があります。

このシナリオのベストプラクティスは、以下を参照する親リポジトリを持つことです。

  • ツールのソース
  • そのツールから生成された結果セット
  • 理想的にはc++コンパイラ(毎日進化することはありません)
  • 理想的にはPythonディストリビューション(毎日進化することはありません)

これらはそれぞれ、独立したリポジトリ(GitまたはMercurial)であるコンポーネントです。
各コンポーネントの1つの正確なリビジョンは、親リポジトリによって参照されます。

すべてのプロセスは、コンポーネントベースのアプローチを代表するものであり、SCM(ここではソフトウェア構成管理)を最大限に活用する上で重要です。

于 2010-07-14T10:25:31.267 に答える