Pythonを使用して、RAMにロードしたり処理したりせずに(CPUを節約するために)画像(可能な場合は圧縮形式)から単一のピクセルを直接取得する(取得するだけで、変更しない)方法はありますか? )?
詳細:
私のアプリケーションは、画像の巨大なデータベースを持ち、画像のみを対象としています。
したがって、私が選択したのは、イメージをハードドライブに直接保存することです。これにより、DBMSの追加のワークロードが回避されます。
ただし、もう少し最適化したいと思います。メモリにロードせずに、画像から1つのピクセルに直接アクセスする方法(アプリケーションが実行する画像に対する唯一のアクション)があるかどうか疑問に思っています。
PILピクセルアクセスはそれを可能にしますか?または別の方法はありますか?
画像のエンコードは私自身の選択なので、いつでも変更できます。現在、PNGまたはJPGを使用しています。生で保存することもできますが、可能であれば画像を少し圧縮したままにしておきたいと思います。しかし、ハードドライブはCPUやRAMよりも安いと思うので、それを行うために画像をRAWのままにする必要がある場合でも、それでも良い方法だと思います。
ありがとうございました。
アップデート
ですから、恐れていたように、PNGなどの可変圧縮形式では不可能なようです。
私の質問を洗練させたい:
- ヘッダーを読み取るだけで任意の部分にアクセスできる一定の圧縮形式(必ずしも画像形式に固有ではありません。プログラムでアクセスします)はありますか?
- 技術的には、Pythonを使用してファイルからバイトに効率的に(高速でノンブロッキングで)アクセスする方法は?
解決
おかげさまで、すべての行でランレングスエンコーディングを使用し、すべての行を最大行と同じ長さにパディングすることで、説明した機能を正常に実装できました。
このように、各行の固定列数を説明するヘッダーを事前に準備することで、最初にfile.readline()を使用してヘッダーデータを取得し、次にfile.seek(headersize + fixedsize * y、0)を使用して行に簡単にアクセスできます。 )ここで、yは現在選択されている行です。
ファイルは圧縮されており、メモリ内では1行のみをフェッチします。すべてのRLE値を反復処理するだけでピクセルが正確にどこにあるかを計算できるため、アプリケーションはそれを解凍する必要さえありません。したがって、CPUサイクルも非常に簡単です。