033 測定機器をコントロールするためのExcelファイルの読み書き時間

2022/04/09

その他/雑談

t f B! P L

以前の投稿 026 PyVISAとExcelファイルで測定機器をコントロールするから始まった,測定機器をコントロールするためにExcelファイルを読み書きする方法の紹介ですが,散々,「Excelファイルの読み書きには時間がかかります」と脅しをかけてきました.
今回は,実際にExcelファイルにデータを読み書きした時間を測定したので,それを紹介します.

読み書き時間の測定は,下記の手順で行いました.

  1. 65000行×4列(=27万個)のダミーのデータ(円周率にデータ番号をかけたもの)をnumpy配列として作成
  2. ワークブックにシートを作成し,ダミーのデータを書き込んでExcelファイルとして新規保存し,処理時間を測定する(Excelファイルの書込み時間として測定)
  3. 新規作成したExcelファイルをオープンし,ダミーのデータを読み込み,処理時間を測定する(Excelファイルの読み込み時間として測定)

5回ほど読み書きした時間を測定し,平均値をとると
    読み込み時間: 2.3[s]
    書込み時間:    3.6[s]
PCの環境(CPUやファイルを保存するハードディスク/SSD)によって,読み書き時間は多少変化するでしょうが,27万個のデータをExcelファイルに読み書きする時間は上記のよう数秒かかりました.

これを遅いと感じるか,そんなものかと感じるかですが,測定した数多くの波形データを全てExcelファイルとして保存するのは避けた方が良いと思います.
(波形データを保存するのに最適なファイルフォーマット形式があるのですが,本ブログで紹介するには複雑すぎるので,紹介は予定しておりません)

但し,数百万個を超えるようなデータはExcelファイルとして読み書きするには不向きですが,数十~数万個程度のデータであれば,Excelファイルとして実用的な時間内に読み書きできます.Pythonopenpyxllxmlパッケージを使って,業務や研究に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))

このブログを検索

アーカイブ

自己紹介

C++やC#を使って数値解析プログラムの開発を長年行ってきました.
今は,Pythonを使った自動処理システムの開発をメインに行っています.

QooQ