質問
HULFT Square Storage 配下の数千ファイル・任意階層のフォルダーに対して、ファイルパスおよび更新日時の一覧を取得する方法はありますか?なお、filesystem_read(ファイルシステム読み取り)を「構造」「再帰的=true」で使用した場合、処理時間が非常に長くなることがあります。filesystem_read の性能特性やスペックアップの効果についても教えてください。
回答
■filesystem_read の性能特性・スペックアップ効果について
filesystem_read を「構造」「再帰的=true」で実行すること自体に不具合情報はありませんが、再帰的処理はオペレーションの性質上、処理時間が長くなりやすい傾向があり、処理時間はディレクトリ構成やオブジェクト数に影響されます。なお、ファイル数・フォルダー数に応じた推奨値や目安となる数値は確認できていません。
また、同一 Workspace・同一 Integrateサービス上で、同一のファイル数・内容・フォルダー階層にもかかわらず処理時間に大きな差が生じる場合がありますが、その明確な原因は特定できていません。
Integrate のスペック変更については、メモリや CPU が顕著に枯渇している場合は処理速度の向上が見込めますが、CPU・メモリに余裕がある状態ではスペックアップによる明確な改善は断言できません。また、スペック変更は複数処理を並行実行する際に効果が期待できることが多く、単一処理の速度向上にはあまり効果がない認識です。
■代替構成:ファイル名一覧取得処理を利用した MAIN/SUB スクリプト方式
処理時間の短縮改善策として、filesystem_read を使用せず「ファイル名一覧取得処理」コンポーネントを利用した MAIN/SUB スクリプトの再帰呼び出し方式で実現できます。弊社過去事例においても処理時間の改善実績があります。
実装手順は以下の通りです。
1. 任意のプロジェクトを作成し、スクリプト「ファイルリスト取得_MAIN」を作成する
※スクリプト「ファイルリスト取得_MAIN」の作成後の全体イメージ

2. 以下の文字列型スクリプト変数を4つ作成し、それぞれに初期値を設定する
- CSVPath:ファイルリストを出力するCSVファイル格納先のストレージパスを初期値に指定
- RootPath:ファイルリスト取得先のフォルダーのストレージパスを初期値に指定
- ScriptPath:初期値に「ファイルリスト取得_SUB」を指定
- FolderPath:初期値は空欄のまま設定しない
3. [ファイル/ディレクトリー削除]コンポーネントを配置し、対象パスに変数 ${CSVPath} を指定する。削除オプションの[ファイル/ディレクトリーが存在しない場合はエラー]のチェックを外す

4. [ファイル名一覧取得処理]コンポーネントを配置し、対象パスに変数 ${RootPath} を指定する

5. [CSVファイル書き込み処理]コンポーネントを配置し、ファイルの項目に ${CSVPath} を指定する。列一覧は任意の列名で4列分追加する

6. [ファイル名一覧取得処理]と[CSVファイル書き込み処理]の間にマッピングを追加し、[条件による抽出]ロジックで type が「file」のデータを抽出する

7. [繰り返し(データ件数)]コンポーネントを配置し、分割パスに「/filelist/file」を設定する。処理時間の効率化のため、ログ設定の[ログを出力する]のチェックを外すことを推奨する

8. [ファイル名一覧取得処理]と[繰り返し(データ件数)]の間にマッピングを追加し、[条件による抽出]ロジックで type が「directory」のデータを抽出する。出力データ側の foreach のスキーマは手動で設定する

9. 繰り返しフローの中に[変数代入]コンポーネントを配置し、連結ロジックにてスクリプト変数「RootPath」+「/」+ foreach の「name」の順で連結し、「FolderPath」に代入する。入力ドキュメント側の foreach のスキーマは手動で設定する

10. 繰り返しフローの中に[スクリプト呼び出し]コンポーネントを配置し、呼び出し先に変数 ${ScriptPath} を指定する。入出力タブにて[一覧を手動で設定]にチェックを付け、入力変数として CSVPath・RootPath(FolderPath の値)を指定する

11. スクリプト「ファイルリスト取得_MAIN」をコピーし、プロジェクトに貼り付けて名前を「ファイルリスト取得_SUB」に変更する(スクリプト名を右クリックし、[プロパティ]メニューから変更できる)

12. 「ファイルリスト取得_SUB」の以下のスクリプト変数の設定を変更する
- CSVPath:初期値を空欄にし、[スクリプト入力変数として使用する]にチェックをつける
- RootPath:初期値を空欄にし、[スクリプト入力変数として使用する]にチェックをつける
13. 「ファイルリスト取得_SUB」から[ファイル/ディレクトリー削除]コンポーネントを削除する
14. スクリプト「ファイルリスト取得_MAIN」を実行する。変数「RootPath」で指定したフォルダー配下のファイル一覧が、変数「CSVPath」で指定したパスにCSVファイルとして出力される
補足
上記スクリプトは実行開始時にCSVファイルを削除し、再作成する処理となっています。スクリプトを再実行すると前回実行時のCSVファイルは上書きされます。
実装時に[ファイル名一覧取得処理]からFolderList用マッパーへのデータフローが接続されていない場合、[繰り返し(データ件数)]の処理件数が0件となるため、データフローの接続を確認してください。
コメント
0件のコメント
記事コメントは受け付けていません。