ファイルの書き込みの比較
前回、ファイルの書き込みで「ファイルを開いて、データを全て書き込んでから閉じる」と「開いて1行書いて閉じるを繰り返す」を比較しました。
その結果、「ファイルを開いて、データを全て書き込んでから閉じる」方がよかったというお話をしました。
今回はさらに「データを処理しつつ書き込む」方がいいのか、それとも「データをリストに格納して、最後に書き込む」方がいいのかを比較していきます。
プログラムのほとんどの部分は前回と同じなので解説は省略しますので、もし気になる点がありましたら、前回の記事をご確認いただけると助かります。
ではでは始めていきましょう。
追加するプログラム
まず最終的にファイルに書き込むのはPandasを使っていきますので、Pandasのインポートを行います。
import pandas as pd
そして前回のようにランダムな小数を生成し、ファイルに書き込んでいきます。
「データを処理しつつ書き込む」は前回のfilewrite1関数を使っていきますが、「データをリストに格納して、最後に書き込む」を実行するために新たな関数を作成します。
def filewrite3(text_filepath, memory_filepath, time_start):
df = pd.DataFrame()
value_list = []
for _ in range(cycles):
value_list.append(random.random())
memorySave(memorylog_filepath, time_start)
df['Value'] = value_list
df.to_csv(text_filepath)
memorySave(memorylog_filepath, time_start)
簡単にいうと、ランダムな小数を作成し、リストvalue_listに格納します。
その後、Pandasのデータフレームに格納し、CSVファイルとして書き出しています。
またグラフ化するためのプログラムは前回と同じです。
実行結果
それでは実行していきましょう。
今回もfilewrite1関数とfilewrite3関数を3回ずつ実行してみました。
filewrite1関数:データを処理しつつ書き込む
1回目。
2回目。
3回目。
処理時間 | 最大メモリ使用量 | |
1回目 | 2分2秒 | 6 MB |
2回目 | 2分1秒 | 5 MB |
3回目 | 2分5秒 | 0 MB(初期値よりも下がった) |
filewrite3関数:データをリストに格納して、最後に書き込む
1回目。
2回目。
3回目。
処理時間 | 最大メモリ使用量 | |
1回目 | 2分7秒 | 56 MB |
2回目 | 1分53秒 | 86 KB |
3回目 | 2分7秒 | 6 MB |
今回、正直言って「データをリストに格納して、最後に書き込む」方がリストに大量のデータを格納していることから、メモリ使用量が爆上がりして、処理時間が長くなる、さらにリストに格納した後、再度ファイルに書き込むという2段階の動作のため、処理時間にかなり差が出ると予想していました。
しかしながら予想に反して、ほとんど変わらないという結果になりました。
もちろん今回のデータは小数という比較的一つのデータが小さいものだったため、こういう結果になったのかもしれません。
それでも最後のファイルの書き込みがPandasを使ったおかげか、ほとんど処理時間がなかったのが驚きです。
こういうのを目の当たりにすると、やはりライブラリって偉大だなと思います。
ともかく思ったよりもリストに格納しておいて、後からPandasを使ってファイルに書き出すというのはいいやり方だと言えそうです。
その時々で使い分けができればいいかなと思います。
ではでは今回はこんな感じで。
コメント