大量のファイル操作を伴う処理は、ストレージの性能にもよりますが、大抵は遅い処理になります。
そこで、メモリ内で完結するようにファイル操作を行うと、どのくらい高速化されるか、実際に確認してみました。
tmpfsというLinuxにあるメモリ内の一時領域を利用します。
検証用のPythonコード:
まずは計測用に
- ファイルを1000個作成
- そこにランダムな8桁の数字を1行づつ書き足していく
- これを10回繰り返す
というコードを用意します。通常のSSD上のディレクトリーでの処理速度と、tmpfsのマウント先である /dev/shm/ に fileIO というディレクトリでの処理速度を比較してます。
import os
import random
import time
start_time = time.time()
def generate_random_number():
return str(random.randint(10000000, 99999999))
def append_random_number(file_path):
with open(file_path, 'a') as file:
random_number = generate_random_number()
file.write('\n' + random_number)
def create_files_with_random_numbers(output_directory):
for i in range(1, 1001):
file_name = f'{i:03}.txt'
file_path = os.path.join(output_directory, file_name)
with open(file_path, 'w') as file:
file.write(generate_random_number())
for _ in range(1, 10):
append_random_number(file_path)
output_directory = '/dev/shm/fileIO'
create_files_with_random_numbers(output_directory)
# 経過時間の表示
elapsed_time = time.time() - start_time
print(f'elapsed_time:{elapsed_time:.3f} sec')
結果
以下のようになりました。普通のストレージ(ssd)だと12.850秒で、tmpfs上だと0.258秒でした。ざっと50倍ほど速いです。
もちろん tmpfs内のデータはシャットダウンすると消えてしまうので(一時的にしか使えない)、必要に応じて、別に処理済みのファイルは永続する領域にコピーするなりの対応が必要です。