メモ_大量のファイル操作をメモリ内で完結させて高速化

大量のファイル操作を伴う処理は、ストレージの性能にもよりますが、大抵は遅い処理になります。

そこで、メモリ内で完結するようにファイル操作を行うと、どのくらい高速化されるか、実際に確認してみました。

tmpfsというLinuxにあるメモリ内の一時領域を利用します。

 

検証用のPythonコード:

まずは計測用に

  1. ファイルを1000個作成
  2. そこにランダムな8桁の数字を1行づつ書き足していく
  3. これを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内のデータはシャットダウンすると消えてしまうので(一時的にしか使えない)、必要に応じて、別に処理済みのファイルは永続する領域にコピーするなりの対応が必要です。