2

S3 に保存されたファイルに JSON メッセージのコレクションがあります (1 行に 1 つのメッセージ)。各メッセージには、メッセージの一部として一意のキーがあります。このキーが主キーとして使用される単純な DynamoDB テーブルもあります。テーブルには、対応する JSON メッセージが配置されている S3 ファイルの名前が含まれています。

私の目標は、キーを指定してファイルから JSON メッセージを抽出することです。もちろん、最悪のシナリオは、メッセージがファイルの最後の行にある場合です。

botoライブラリを使用してファイルからメッセージを抽出する最速の方法は何ですか? 特に、どうにかしてファイルを 1 行ずつ直接読み取ることは可能ですか? もちろん、内容全体をローカル ファイルboto.s3.key.get_file()に読み込んでから、ファイルを開き、1 行ずつ読み込んで ID が一致するかどうかを確認できます。しかし、より効率的な方法はありますか?

どうもありがとう!

4

3 に答える 3

3

S3はこれを行うことができません。とはいえ、他にもいくつかのオプションがあります。

  1. DynamoDB の行番号の代わりに、レコードの長さと位置 (バイト オフセット) を保存します。これにより、Range:ヘッダーを使用してそのレコードだけを取得できます。
  2. { S3 object key, line number } => { position, length }タプルを格納するためにキャッシング層を使用します。でレコードを検索したい場合は{ S3 object key, line number }、キャッシュを参照してください。このデータをまだ持っていない場合は、今と同じようにファイル全体を取得する必要がありますが、ファイルを取得したら、その中のすべての行のオフセットを計算し、その行の作業を保存できます。
  3. JSON レコードを DynamoDB に直接保存します。64 KB の項目制限を考えると、これは実用的である場合とそうでない場合があります。
  4. 各 JSON レコードを S3 に個別に保存します。その後、DynamoDB のキー ルックアップを排除し、特定のレコードの S3 に直接移動できます。

どちらが最適かは、アプリケーション アーキテクチャ、このデータへのアクセス方法、同時実行性の問題 (現在のソリューションではおそらく重要ではない)、および待機時間とコストに対する感度によって異なります。

于 2012-10-02T19:26:15.307 に答える
1

組み込みの readline をストリームで使用できます。

const readline = require('readline');
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const params = {Bucket: 'yourbucket', Key: 'somefile.txt'};
const readStream = s3.getObject(params).createReadStream();
const lineReader = readline.createInterface({
  input: readStream,
});
lineReader.on('line', (line) => console.log(line));
于 2016-08-10T15:40:01.510 に答える