大きなバイナリファイルを読み書きする必要があります。私はBLOCK_SIZE
と呼んでいますが、好きな、あるいは最適なバイト数がありますか?read()
は一度に必要ですか?大きなバイナリファイルを読み書きするときのブロックサイズ
1バイトは確かに少しです。私はRAMに4GBを読み込むことは良いアイデアだとは思っていません - 「最高の」ブロックサイズですか?それともファイルシステム(私はext4上にある)に依存していますか?私は何を考慮する必要がありますか?
python's open()
はさらにbuffering
引数を提供します。私もそれを微調整する必要がありますか?
これは2つのファイルin-0.data
とin-1.data
をout.data
に結合するサンプルコードです(現実には、手元にある質問とは無関係の処理が増えています)。 BLOCK_SIZE
はbuffering
のデフォルトであるように思われio.DEFAULT_BUFFER_SIZE
に等しくなるように選択される:
from pathlib import Path
from functools import partial
DATA_PATH = Path(__file__).parent/'../data/'
out_path = DATA_PATH/'out.data'
in_paths = (DATA_PATH/'in-0.data', DATA_PATH/'in-1.data')
BLOCK_SIZE = 8192
def process(data):
pass
with out_path.open('wb') as out_file:
for in_path in in_paths:
with in_path.open('rb') as in_file:
for data in iter(partial(in_file.read, BLOCK_SIZE), b''):
process(data)
out_file.write(data)
# while True:
# data = in_file.read(BLOCK_SIZE)
# if not data:
# break
# process(data)
# out_file.write(data)
これには確かな回答はありません。問題のマシンのOS、ファイルシステム、物理ディスクに依存している可能性があります。これが汎用的なソリューションであることを意図している場合は、最良の答えを計算するためのパラメータをシステムに問い合わせるコードを追加することができます。 – cdkMoose
私は 'io.DEFAULT_BUFFER_SIZE'を使って 'システムに質問しました'と思っていましたが、実際にはこのすべての詳細についての経験はありません。 –
このシステムでも静的な回答はありません。これは、多数の変数に依存しますが、そのうちのいくつかは時間とともに変化したり、毎回異なったりする可能性があります。あなたのプログラムやシステムが他に何をしているのかが分かります。最善の方法は、一定の不変の代表的なテストファイルを使用して、その時点で適切なサイズを決定するために何かを書くことです。また、スタンドアロンテストを作成して一度実行して、見積もりを行い、アプリケーションにハードコードすることもできます(または、テストをインストールまたはセットアッププロセスの一部にすることもできます)。 – martineau