質問

さまざまな時系列データを、多かれ少なかれ地理参照されたグリッドに保存しています。緯度と経度 0.2 度ごとに 1 つの値。現在、データはテキスト ファイルに保存されているため、251 日目には次のように表示される可能性があります。

251
 12.76 12.55 12.55 12.34 [etc., 200 more values...]
 13.02 12.95 12.70 12.40 [etc., 200 more values...]
 [etc., 250 more lines]
252
 [etc., etc.]

抽象化のレベルを上げ、パフォーマンスを向上させ、脆弱性を軽減したいと考えています (たとえば、現在のコードでは 2 つの既存のコードの間に 1 日を挿入することはできません)。私たちは BLOB-y RDBMS ハックをいじったり、テキスト ファイル形式の各行をテーブル内の行として複製したりしました (タイムスタンプと緯度のペアごとに 1 行、経度の増分ごとに 1 列 -- やった!)。

「実際の」ジオデータベースにアクセスすることもできますが、緯度と経度で個々の値をタグ付けするオーバーヘッドが法外に大きいと思われます。データのサイズと解像度は 10 年間変わっておらず、今後も変化する可能性は低いです。

私はすべてを NetCDF ファイルに入れることに夢中になってきましたが、ファイルという考え方を完全に克服する必要があると考えています。すべてのソフトウェアが日付からファイル名を割り出したり、複数年分の複数のファイルを処理したりしなければならないのが嫌いです。 。10 年分 (そしてこれからも続く) のデータをすべて 1 つのファイルに入れるという代替案も、実行可能とは思えません。

何か素晴らしいアイデアや製品はありますか?

役に立ちましたか?

解決

皆様のコメントをここにまとめました。

  1. 「独自のファイル I/O コードを書かずに」これらすべてを実行したいと考えています。
  2. 「Java Ruby MATLAB」および「FORTRAN ルーチン」からのアクセスが必要です

これらを合計すると、新しいファイル形式は絶対に必要ありません。 あなたが持っているものを使い続けてください。

最初の要件を緩和してもらえる場合、つまり、独自のファイル I/O コードを記述しても構わない場合は、興味深いオプションがいくつかあります。私は C++ クラスを作成し、SWIG のようなものを使用して、必要な複数の言語で新しいクラスを利用できるようにします。(ただし、SWIG を使用して Java、Ruby、MATLAB、FORTRAN からアクセスできるかどうかはわかりません。他に何か必要になるかもしれません。自分でもやり方がよく分かりません。)

また、「実際、ファイルが必要な場合はテキストの方が好きです。そうすれば、必要に応じて手動で編集できるからです。」とも言いました。

私の信念は、これは見当違いの発言であるということです。独自のファイル I/O ルーチンを作成したい場合は、非常に賢い方法が可能です...そして、究極のフォールバックとして、新しいファイル形式から使い慣れている同じ古いテキスト形式に変換するツールを用意することもできます。そして、変換を戻すもう 1 つのツール。これについては投稿の最後でもう一度触れます...

あなたは私が言及したいことを言いました:

「40 年間にわたる DB 最適化の活用」

データベースは、ラスター データではなく、リレーショナル データを対象としています。他人のDBを利用することはありません 最適化 このようなデータで。データを DB に詰め込むことはできるかもしれませんが、それはほとんど同じではありません。

あなたが私たちに話したすべてに基づいて、私があなたに言える最も有益なことは次のとおりです。 あなたはこう言いました:

「最適化にもっと興味があります 私の 実行速度は良いですが、CPU よりも時間がかかります。」

率直に言って、これにはツールが必要です。これをテキスト ファイルとして考えるのはやめてください。自分が行う一般的なタスクを考え始め、それらの作業を簡単に行えるようにするための小さなツールを、言語を問わずに作成します。

そして、ツールのパフォーマンスが悪いことが判明した場合はどうすればよいでしょうか?それは、フラット テキスト ファイルが粗末な形式だからです。しかし、それは単なる私の意見です。:)

他のヒント

私なら間違いなくテキストからバイナリに変更しますが、毎日を別のファイルに保存します。ファイル名に日付と時刻を含めるなど、間に挿入によってインデックスに不自然さが生じないような方法でファイルに名前を付けることができます。たとえば、場所ごとに複数のフィールドがある場合は、ファイル構造を考慮することもできます。多数のタイムステップから小さなタイルを探すのが一般的ですか?その場合は、数日間のデータを含むタイルとして保存するとよいでしょう。データを効率的に整理する上で大きな役割を果たすデータへのアクセス方法については言及していませんでした。

説明:

「データベース」をタグの 1 つとして追加し、それをオプションとして考慮したことに驚きました。どうしてこれをやったの?

基本的に、各タイム ステップで 2D、単一コンポーネントの浮動小数点イメージが得られます。データのこの見方に同意しますか?

また、既存の 2 つの間に 1 日を挿入したいともおっしゃっていましたが、これは非常に奇妙なことのように思えます。なぜそんなことをする必要があるのでしょうか?5 月 4 日と 5 月 5 日の間に、私の知らない新しい日はありますか?

「圧縮」はあなたにとって重要なことの 1 つですか、それとも単にフラット ファイルにうんざりしていますか?

データを保存するには float または double で十分ですか? それとも、より任意の精度が必要だと思いますか?

また、このデータにアクセスするにはどのようなプログラミング言語を使用しますか?

データの保存方法に関する答えは、データをどう扱うかによって完全に異なります。たとえば、日付または日付範囲を指定して取得するだけの場合は、BLOB としてデータベースに保存するのが合理的です。ただし、特定の値を持つレコードを検索する必要がある場合は、別のことを行う必要があります。

データにアクセスする方法を説明してください/

マット、本当にありがとう、そしてロングネックとジルヴも同様だ。

この投稿は部分的に実験であり、スタックオーバーフローの談話の品質をテストしました。あなたたち/ギャル/地球外生命体が代表者なら、私は納得です。

そして要点で、あなたは私の考えをかなり明確にしてくれました。念のために言っておきますが、必ずしもそうではないかもしれません 埋め込む あなたのアドバイスですが、私もそうなることを知ってください 考え それについては非常に真剣に。>;-)

ファイル形式はそのままにして、既存の C ルーチンや Ruby ルーチンに追加して、不足しているいくつかの低レベル機能 (例:欠落しているタイムステップを挿入するなど)、全体に HTTP フロントエンドをハングさせて、現在利用可能な言語を問わず、データを必要とするあらゆるボックスでデータを消費できるようにします。これらのデータを構築するのは、ほとんどが不変のレガシー ソフトウェアですが、私たちは常にそのデータの新しい利用者を考え出しているため、多言語/複数コンピューターの要件 (忘れてしまいましたか?) は、読み取り側ではなく読み取り側に適用されます。書く側。これにより、多くのセキュリティ問題も回避されます。

皆さん、改めて感謝します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top