以前の投稿 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 件のコメント:
コメントを投稿