必要条件
- ユーザーが最大5GBのCSVファイルをアップロードできるようにすること。
- データを検証し、エラーロウをすべてログに記録すること:
- 列の長さが200文字を超える場合。
- 許可されていない特殊文字が含まれる場合。
- 特定の列が一意であること(ファイル内とデータベース内で重複がないこと)。
- 列の長さが200文字を超える場合。
- ユーザーに返す情報:
- エラーのある行。
- エラーの種類。
- 問題のある値。
- エラーのある行。
全体的なソリューション
処理フローは以下の3つのフェーズに分かれています:
1. ユーザーがファイルをS3にアップロード
- フロントエンドは、署名付きURLまたはS3 SDKを使用してファイルをS3にアップロードします。
- アップロードが成功すると、EventBridgeを介して、またはバックエンドにリクエストを送信して検証プロセスを開始します。
2. バッチ処理:データの検証
検証プロセスは、パフォーマンスを最適化し、タイムアウトやメモリリークのリスクを減らすために複数のステップに分けて実行されます。
a. データベースに一時テーブルを作成
- CSV構造を反映した一時テーブルを作成します。
- エラーをログに記録するための追加列を追加: column_1_length, column_1_regex, is_error, line_numberなど。
b. S3から一時テーブルにファイルをロード
- S3がローカルにマウントされている場合、 LOAD DATA LOCAL INFILE を使用してファイルを直接データベースにインポートします。
- オプションとして、値に埋め込まれた改行文字(\r\n)を削除する前処理を行います。
- データロードの速度を向上させるために一時的にインデックスを無効化し、その後再度有効化します。
LOAD DATA LOCAL INFILE ‘/path_to_file.csv’
INTO TABLE temp_table
FIELDS TERMINATED BY ‘,’
ENCLOSED BY ‘”‘
LINES TERMINATED BY ‘\n’
(column_1, column_2)
SET
column_1 = REPLACE(REPLACE(column_1, ‘\r’, ”), ‘\n’, ”),
column_2 = REPLACE(REPLACE(column_2, ‘\r’, ”), ‘\n’, ”),
column_1_length = CHAR_LENGTH(column_1),
column_2_length = CHAR_LENGTH(column_2),
column_1_regex = column_1 REGEXP ‘[^a-zA-Z0-9+\-_.:=?&/]+’,
is_error = IF (column_1_length > 200 OR column_2_length > 200 OR column_1_regex > 0, 1, 0)
c. エラーロウを取得し、エラーレポートを生成
- is_error = 1の行を選択し、行番号とエラーの説明を含むエラーファイルに書き込みます。
d. ファイル内の重複をチェック
SELECT id_key, GROUP_CONCAT(line_number) AS duplicated_lines
FROM temp_table
GROUP BY id_key
HAVING COUNT(*) > 1;
e. データベースに対する重複をチェック
temp_tableのid_keyをシステムのメインテーブルと比較します。
3. 有効なデータをメインデータベースに挿入
- エラーのない行のみを含めます。
- 使用用途に応じてINSERT INTOまたはREPLACE INTOを使用します。
- オプションとして、デフォルト値、監査フィールドなどのロジックを追加します。
4. 一時テーブルのクリーンアップ
- 処理後に一時テーブルを削除してリソースを解放します。
ヒント&ベストプラクティス
- 大容量データロード中はインデックスを無効化し、その後再度有効化します(ロード時間を大幅に短縮)。
- CSVが正しくエンコードされていることを確認します(UTF-8、BOMなし)。
- コードで行ごとに検証するのではなく、効率的なバルク検証のためにSQLを使用します。
- すべてのエラーを一度にログに記録し、ユーザーが一度に修正できるようにする。逐次修正ではなく、一括修正が可能です。
結論
大容量ファイルのアップロード処理は単にサイズ制限を引き上げるだけではありません。パフォーマンスと拡張性を確保するために、スマートで効率的な処理フローが必要です。このアプローチを採用すれば、必要に応じてさらに大きなファイルにも対応可能です。
同様のソリューションをコードやクラウドアーキテクチャに実装する際のサポートが必要ですか?
Credit: Ton That Bach(Mynavi TechTus Vietnamのテクニカルリーダー)