以前の投稿 026 PyVISAとExcelファイルで測定機器をコントロールするから始まった,測定機器をコントロールするためにExcelファイルを読み書きする方法の紹介ですが,散々,「Excelファイルの読み書きには時間がかかります」と脅しをかけてきました.
今回は,実際にExcelファイルにデータを読み書きした時間を測定したので,それを紹介します.
読み書き時間の測定は,下記の手順で行いました.
- 65000行×4列(=27万個)のダミーのデータ(円周率にデータ番号をかけたもの)をnumpy配列として作成
- ワークブックにシートを作成し,ダミーのデータを書き込んでExcelファイルとして新規保存し,処理時間を測定する(Excelファイルの書込み時間として測定)
- 新規作成したExcelファイルをオープンし,ダミーのデータを読み込み,処理時間を測定する(Excelファイルの読み込み時間として測定)
5回ほど読み書きした時間を測定し,平均値をとると
読み込み時間: 2.3[s]
書込み時間: 3.6[s]
PCの環境(CPUやファイルを保存するハードディスク/SSD)によって,読み書き時間は多少変化するでしょうが,27万個のデータをExcelファイルに読み書きする時間は上記のよう数秒かかりました.
これを遅いと感じるか,そんなものかと感じるかですが,測定した数多くの波形データを全てExcelファイルとして保存するのは避けた方が良いと思います.
(波形データを保存するのに最適なファイルフォーマット形式があるのですが,本ブログで紹介するには複雑すぎるので,紹介は予定しておりません)
但し,数百万個を超えるようなデータはExcelファイルとして読み書きするには不向きですが,数十~数万個程度のデータであれば,Excelファイルとして実用的な時間内に読み書きできます.Pythonのopenpyxlとlxmlパッケージを使って,業務や研究にExcelファイルを活用して下さい.
(Excelファイルであれば,もらった相手も,簡単にグラフ化できるでしょう)
最後に,今回の投稿で,Excelファイルの読み書き時間の測定に使ったPythonスクリプトを参考までに紹介します(そのまま動きます).
#!/usr/bin/env python import os, sys, time import numpy as np import openpyxl as xl #------------------------------------------------------------------------------- def setdata(nrows=65000, ncols=4): array = np.empty((nrows,ncols), dtype=np.float64) for j in range(nrows): for i in range(ncols): array[j,i] = float(np.pi*(j*ncols+i)) return array #------------------------------------------------------------------------------- def savefile(array, savepath="データシート.xlsx", sheetname="データシート1"): wb = xl.Workbook(write_only=True) wb.create_sheet(title=sheetname, index=0) ws = wb[sheetname] (nrows,ncols) = array.shape data = ncols*[0] for j in range(nrows): for i in range(ncols): data[i] = array[j,i] ws.append(data) wb.save(savepath) #------------------------------------------------------------------------------- def readfile(array, readpath="データシート.xlsx", sheetname="データシート1", ncols=4): wb = xl.load_workbook(readpath, read_only=True, data_only=True) ws = wb[sheetname] data = ncols*[0] for row in ws.iter_rows(values_only=True): for i in range(ncols): data[i] = row[i] wb.close() #=============================================================================== if __name__ == "__main__": array = setdata() t0 = time.time() savefile(array) t1 = time.time() - t0 print("save time:%.1f" % (t1)) t0 = time.time() readfile(array) t2 = time.time() - t0 print("read time:%.1f" % (t2))
0 件のコメント:
コメントを投稿