データレイクのチャンネルへ高速に画像とメタデータをアップロードすることについて

「チャンネルに画像ファイルとメタデータを高速にアップロードしたい」につい

て質問させていただきます。

例えばPCの任意のフォルダに画像ファイルが1000個あり、これらのファイル毎に

異なる値のメタデータをセットしてデータレイクに登録したいと仮定します。

これらのファイルとメタデータをデータレイクにアップロードしたい場合、一番

高速で処理が終了する方法を教えていただけますでしょうか?

弊社が以下の方法で実際に実行したところ、処理が終了するのに30分程度かかっ

ています。この処理を早く終了させたいと考えております。

<案1>

  1. channel.upload_dir()メソッドを使って、ディレクトリ内の画像ファイルを

一括アップロードする。

  1. channel.list_files()メソッドを使って、チャンネルにアップロードした

ファイルリストを取得する。

  1. file.metadata[‘abc’]で、各ファイルにメタデータをセットする。

  2. file.commit()メソッドを使って、メタデータをコミットする。

<案2>

  1. channel.upload_file()メソッドを使って、1ファイルずつメタデータをセッ

トしてファイルをアップロードする。

ちなみに以下のチュートリアルサイトを参考にしました。

https://sdk-spec.abeja.io/datalake/sample_tutorial.html?highlight=upload_dir

ご質問ありがとうございます。
アップロードを高速化頂く方法については、マルチスレッドもしくはプロセス等を活用頂くのはいかがでしょうか? (ファイル数やラベル数により速度影響はあるかもしれませんが、お試しくださいませ)

以下、参考情報となりますので、ご参考ください。

■DataLakeへのアップロード

フォルダ単位でLabel付与を実施、マルチスレッドでアップロード

from abeja.datalake import Client as DatalakeClient
from glob import glob

# set datalake channel_id
channel_id = 'XXXXXXXXXXXXX'

datalake_client = DatalakeClient(organization_id, credential)
channel = datalake_client.get_channel(channel_id)

# set folder_path 例:flowersの配下のフォルダをLabel名に指定したい場合:'./flowers/*'
dir_names = list(glob('XXXXXXXXXXXX')
selected_dirnames = [d for d in dir_names]

import os
import threading
from tqdm import tqdm

# upload directory data to datalake
def upload():
        # convert to uppercase and remove numbers
        label_name = os.path.basename(d)
        metadata = {'label': label_name}
        channel.upload_dir(d, metadata=metadata)
        return
        
for d in tqdm(selected_dirnames):
        threading.Thread(target=upload).start()

ご連絡ありがとうございます。試してみます。

上記の回答を実行した事に関連してお教えいただきたいことがございます。
SDKを使ってデータレイクにチャンネルを作り、大量の画像ファイルをアップロードしました。

※channel.upload_dir() もしくはchannel.upload_file()のSDKを使用。

プログラム側ではSDKの呼び出しが完了(SDKメソッドから制御が戻ってきている)していますが、プラットフォームの管理画面を再描画するとアップロードしたファイル数が少しずつ増えていき、ある程度時間が経過した後、全ファイルのアップロードが完了したことが確認できました。

つまり、御社のSDKやWebAPI全般に言えるのですが、

「データ更新系のSDKメソッドやWebAPIを呼び出して制御が戻ってきても、プラットフォーム側では処理が完全に完了していない時がある。」

という認識でよろしかったでしょうか?

また、呼び出したSDKの処理が完了したかを確認したい場合、プログラムは参照系のSDKやAPIを使って最新情報を取得して個別に判断する必要があるということでしょうか?

早速のご活用ありがとうございます!

はい、ご認識の通り、SDKやCLIをご利用いただき、ファイルをアップロード頂いた場合、ファイルのサイズや数によっては、処理反映に時間を要するケースがあります。内部的には処理を実施している状態ですので、ファイルのサイズや数によっては、反映に少々おまちいただくケースがある旨、ご留意いただけますと幸いです。

1 Like