観測データをアーカイブするために、LinuxとPyhtoでデータ処理時間を比較してみた。
timeコマンド
time
コマンドはコマンド・プログラムを引数としてとり、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかった出力する
例)sleep 10
$ time sleep 10
real 0m10.002s
user 0m0.001s
sys 0m0.002s
time
が出力するreal
, user
, sys
はそれぞれ次のような意味になる
項目 | 意味 |
---|---|
real | プログラムの呼び出しから終了までにかかった実時間(秒) |
user | プログラム自体の処理時間(秒)(ユーザCPU時間) |
sys | プログラムを処理するために、OSが処理をした時間(秒)(システム時間) |
sleep 10
はプログラム呼び出しから終了までに10.002秒がかかったが、sleep 10
自体の処理には全然CPUが使われていないことがわかる。
ファイルデータの書き込み・追記時間の検証
以下のShellスクリプトとPythoで比較:
Shell Scriptのほうが、半分位の時間で処理可能
——————————————-
Shell Script:
cat log01.txt > log20.txt
cat log02.txt >> log20.txt
kazuki:~/work/test$ time sh cat.sh
real 0m0.007s
user 0m0.004s
sys 0m0.000s
——————————————-
Pyhton:
f = open(‘log01.txt’)
data = f.read()
f.close()
out = open(“log20.txt”, “a”)
out.write(data)
out.close()
f = open(‘log02.txt’)
data = f.read()
f.close()…..
kazuki:~/work/test$ time python bk.py
real 0m0.027s
user 0m0.004s
sys 0m0.016s
————————————-
百葉箱観測データのやりとり例
データサイズ:3.7MB, CSV
Python 1
import sys
import urllib
import pandas as pd
import numpy as np
url = ‘http://miyasan.sakura.ne.jp/logdata/fujimi280/fujimi280.txt’
f = urllib.urlopen(url)
data = f.read()
out = open(“fujimi280.txt”, “w”)
out.write(data)
out.close()
df=pd.read_csv(“fujimi280.txt”,header=None)
data = df.tail(20000)
data.to_csv(‘fujimi.csv’)
————————————————-
kazuki:~/work/test$ time python bk1.py
real 0m3.373s
user 0m0.692s
sys 0m0.136s
————————————————
Pyhton 2
url = ‘http://miyasan.sakura.ne.jp/logdata/fujimi280/fujimi280.txt’
df=pd.read_csv(url, header=None)
data = df.tail(20000)
data.to_csv(‘fujimi.csv’)
————————————————-
kazuki:~/work/test$ time python bk1.py
real 0m3.414s
user 0m0.732s
sys 0m0.132s
—————————————————
Pythonのファイル操作でも、PandasのCSVReadでも、ほぼ同じ時間
Programのシンプルさからすれば、Pandasを使う方がよい。
CSV ファイル出力 DataFrame.to_csv() メソッドでの注意
テキストデータを読込み、加工して、テキストファイルとしてへ書き込む際、データフォーマットがfloat64の場合、csv出力は勝手に小数点以下の0を丸める(下記データ)
よって、float_format=’%.2f’を記述して、オリジナルの観測データと同じフォーマットにする
例)
data_dir = ‘/home/kazuki/work/test/log20.txt’
df=pd.read_csv(data_dir,header=None)
#df.dtypes
#Out[73]:
#0 object
#1 float64
#2 int64
#3 int64
#4 float64
#5 float64
#6 float64
#7 int64
#dtype: object
#original data:
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.10,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.40,86.20,8
2016/09/01 00:10:30,12.84,16,600,16.00,899.40,86.51,1
#df.to_csv(‘log21.txt’,index=False, header=False)
to_csv output data :
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.1,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.4,86.2,8
2016/09/01 00:10:30,12.84,16,600,16.0,899.4,86.51,1
#df.to_csv(‘log21.txt’,index=False, header=False,float_format=’%.2f’)
to_csv output data :
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.10,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.40,86.20,8
2016/09/01 00:10:30,12.84,16,600,16.00,899.40,86.51,1
diff log20.txt log21.tx –> OK!! オリジナルデータと差分なし