1

そのため、新しいプロジェクトのワークフローを生成中です。最初のフェーズでは、大量のデータ (テスト ケースのバイナリ ファイル形式に基づいて最大 1 TB) を生成する C/C++ コードがあります。このデータはデータベースにインポートされ、そこに存在する別のデータセットと比較されます。

私が持っている質問は、データベース ソフトウェアへのポートを開いてそこに直接書き込むか、ディスクに多数の小さなファイル (約 10 億) を書き込み、後でデータベースにインポートする方が速いでしょうか? C コードは時間制限のあるクラスターで実行されるため、すぐに終了する必要があります。

4

3 に答える 3

1

正しい答えは「場合によりますが、測定する必要があります」のはずですが、これは、許容できる確実性で限定されていない答えを与えることができる場合です。

データベース サーバーと直接通信すると、ほぼ確実に高速になります。

その理由は、最初にディスクに書き込み、次にデータをネットワーク経由で送信する前に再度読み取ることは、ディスク ドライブからの追加の遅延と帯域幅の制約を伴うためだけではありません (すべてのファイルが少なくとも 1 ページを占有するため、これは避けられません)。ページ キャッシュ、10 億のファイル (それぞれのコンテンツが 1 バイトしかない場合でも) は、少なくとも 4 TiB 相当のバッファーを必要とするため、キャッシュはありません)。4TiB のデータの読み取りには、高速ディスクでの順次読み取りを想定すると、3 ~ 5 時間かかります。ディスクへの書き込みは、遅延ライトバックのおかげで実際にはほとんど順次に行われますが、データを送信する前に再度読み込むことは、連続していないことがほぼ保証されています (また、先読みが発生するようなことはなく、個別のファイルでは不可能です)。運が良ければ一部の操作はまだ重複している可能性がありますが、

要求を受け入れるデータベースの能力またはネットワーク帯域幅によって制限される可能性があることは事実ですが、これは、余分なコピーを追加しなくても、常に制限されているものであり、少なくとも前者はあなたのものです.かなり簡単に最適化できます。インデックスなしでデータベースにデータを挿入できます。これは非常に高速です。その後、データベース サーバーは、後で必要になる可能性のある任意のインシデントを作成できます。もちろん、これには時間がかかる場合がありますが、更新のたびにインデックスを更新するよりも桁違いに高速である可能性があります (さらに、限られた時間のジョブが迅速に終了することが重要である場合、誰が気にしますか)。

ただし、さらに重要なことは、10 億個のファイルを開いたり閉じたり、再度開いたりするだけでも、かなりの時間がかかることです (これには、ディレクトリ階層のトラバース、名前から inode への変換、アクセス チェックなどが含まれます)。個々のファイルにアクセスすることはまったく正気ではありません。物理的な「シーク」が行われないソリッド ステート ディスクでも、ランダム アクセス時間は「ゼロ」ではありません (はるかに小さいですが、0.1ms × 10 億は、シークに約 3 時間余分に費やされます!)。

于 2015-03-19T15:05:38.217 に答える
1

実行しているデータベースを指定しなかったため、理論的には答えは何でもかまいません。ただし、実際には最新のハード ディスク ドライブは遅く、書き込み速度は約 100 MB/s です。通常、データベースに大量のデータを挿入する場合、これが制限要因になります。1TBはRAMに収まらないため、コンピューターのRAMは役に立ちません。ただし、データベース固有のトリックを使用する必要がある場合があります。たとえば、すべてのデータを 1 つのトランザクションに追加したり、一度コンパイルして複数回呼び出す前処理済みのクエリを追加したりする必要があります。ソリッド ステート ディスク (SSD) を使用している場合、答えは異なる場合がありますが、それは SSD の速度によって異なります。

また、ネットワーク インターフェイスによって追加のパフォーマンスが制限される場合があることにも注意してください。ギガビット リンクとは、実際には 125 MB/秒を少し下回ることを意味します。そのため、データベースが別のコンピューター上にある場合、ネットワーク インターフェイスのパフォーマンスが制限要因である可能性があります。ただし、同じコンピューターでデータを生成している場合、または 10 ギガビット リンクを使用している場合は、ネットワーク リンクのパフォーマンスが制限要因になることはほとんどありません。

ただし、唯一の明確な答えは、自分の環境でテストすることです。パフォーマンスが重要な場合は、ベンチマークの技術を学んでください。

テーブルにインデックスはありますか? その場合は、最初にデータを挿入し、すべてのデータが挿入された後にのみインデックスを構築すると、パフォーマンスが向上する可能性があります。

于 2015-03-19T14:05:28.670 に答える