@daisei-yoshino

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonで複数種のファイルをまとめて管理する方法はありますか?

現在の状況

趣味で作っているPythonのプログラムで、結構な数の細かいディレクトリ・ファイルを扱うことになっています。
構成としては、

親ディレクトリ(複数あるが数は少ない)
└子ディレクトリ(基本的に数百個ある)
 ├画像ファイル(基本的に1つ、変更処理はほぼしない)
 └JSONファイル(数個、結構書き換えがある、構成は各子ディレクトリで若干異なる)

という形式になっています。
子ディレクトリが増えるごとに、親ディレクトリの移動処理の時間が目に見えて増えており、これをどうにかしたいと考えています。また、JSONファイルは基本的に1KB未満で、ファイルシステムを考えると容量の無駄もありそうです。

解決したいこと

もし親ディレクトリを

  • 画像ファイルと各JSONファイルが対応しており、その対応関係を崩したくない(別ディレクトリのデータ同士を紐づけにくい構成にしたい)
  • 容易に画像データを読み出せる
  • JSONファイル(か、それに相当するデータ)の頻繁な読み書きができる
  • 万が一の為、tarファイルのようなものよりデータ破損に強いことが望ましい
  • 自分一人が実行するだけのプログラムなので、多少実行速度が落ちるのは許容できる

こういった要件を満たす単一ファイル等にする方法があれば利用してみたいのですが、そもそもどういうものを調べれば良いのかもわからない状態です……。

JSONファイルが細かいのが問題であるならば、子ディレクトリ内のファイルをまとめるだけでも状況が改善しそうではあります。

何か良い方法が分かるという方、ご教授下さい……。

自分で試したこと

そもそも何と調べたら良いのかも分からない状態です……

0 likes

JSON を SQLite データベースに保存するのはどうでしょうか。画像についてはデータベースにパスだけ保存するか、 blob として丸ごと保存するか用途に合わせて選ぶとよさそうです。

SQLite はすべての要件を満たし、さらに数十KB程度のデータを大量に読み書きする場合はファイルシステムと同等以上の速度が出ることもあります。 https://www.sqlite.org/fasterthanfs.html

1Like

@uasi
ご回答ありがとうございます!
DB自体についての知識があまりなかったもので、自分自身では他の手段と比較ができない状態でした。
そこまで容量が大きくなければ、blobでも速度が落ちるということはないのですね。聞きかじりの知識(ISUCONの解説)で、「DBに画像をblobで保存すると遅い」というので、そこが気になっていました。あれは大量アクセスに耐えるサービス向けのチューニングの世界の話だったのでしょうか……
画像ファイルも100KB程度とそこまで容量が大きいものではないので、blobとして保存しても良さそうです。
各種JSONですが、種類が限られそうなので、それぞれをcolumnとして持ってしまっても良さそうです。
嬉しい情報をありがとうございます!

0Like

Your answer might help someone💌