(この質問は元の作成者によって変更されており、サンプル コードは変更されているため、お使いのマシンで実行できます)
時系列データをpytablesにロードしています(このテストケースでは、最大200万行、23列のほとんどが浮動小数点値です)。また、同じpytableファイルに、同じ数の行と列、および列名を持つ対応するテーブルを作成したいと思いますが、品質管理の「マスク」として使用されるint8データ型を使用します。これを行うには、データ テーブルから列名と行数情報を取得し、これを使用して、品質管理 pytable テーブルの作成/追加に使用される numpy ゼロ レコード配列を作成します。
この問題は、numpy ゼロ レコード配列を新しい「マスク」pytable に追加すると発生します。pytable の作成/追加に使用される numpy ゼロ レコード配列は正しいサイズですが、結果の pytable は予想よりもかなり大きくなります。
次の実行可能なコード例は、問題を示しています。pytable を作成し、値がゼロのレコードの「nrows」を含むテーブルを作成することを期待して、numpy zero rearrays をテーブルに追加します。結果の pytable には、Vitables で表示したときに予想よりも多くの行があります
これらの余分なデータ行がどこから来ているのかわかりませんか? 任意の提案をいただければ幸いです。
Python 2.7.2、pytables 2.3.1、numpy 1.6.1.1 を使用
import tables
import numpy as np
import string as str
Storename = 'Test.h5'
Storetitle = 'Test'
PathList = ['Lvl0','Lvl1']
Tablename = 'Data'
storeq = tables.openFile(Storename, mode='a', title= Storetitle)
for ix, agroup in enumerate(PathList):
mypath0 = '/'+str.strip('/'.join(PathList[0:ix]))
mypath1 = '/'+str.strip('/'.join(PathList[0:ix+1]))
try:
storeq.getNode(mypath1)
except(tables.exceptions.NoSuchNodeError):
storeq.createGroup(mypath0,PathList[ix])
pathq = mypath1
qtable = None
tfields = ['DateTime','f0','f1','f2','f3','f4','f5','f6','f7','f8','f9']
nfields = 11
tformats = ['int64', 'int8', 'int8', 'int8', 'int8', 'int8',
'int8', 'int8', 'int8', 'int8', 'int8']
nrows = 2122387
rowchunk = 100000
rowsteps, rowrem = divmod(nrows, rowchunk)
for ix in range(rowsteps):
fillarray = np.zeros((rowchunk,nfields), {'names': tfields, 'formats': tformats})
if qtable==None:
print('create')
qtable = storeq.createTable(pathq, Tablename, fillarray)
qtable.flush()
else:
print('append :', ix, fillarray.shape)
qtable.append(fillarray)
qtable.flush()
if rowrem > 0:
fillarray = np.zeros((rowrem,nfields), {'names': tfields, 'formats': tformats})
if ix == 0:
print('create')
qtable = storeq.createTable(pathq,Tablename, fillarray)
qtable.flush()
else:
print('append :', rowrem, fillarray.shape)
qtable.append(fillarray)
qtable.flush()
qtable.close()
storeq.close()
以下は、numpy zero rearrays が品質管理 pytable に書き込まれるときに作成される print ステートメントの出力です。
create
('append :', 1, (100000, 26))
('append :', 2, (100000, 26))
('append :', 3, (100000, 26))
('append :', 4, (100000, 26))
('append :', 5, (100000, 26))
('append :', 6, (100000, 26))
('append :', 7, (100000, 26))
('append :', 8, (100000, 26))
('append :', 9, (100000, 26))
('append :', 10, (100000, 26))
('append :', 11, (100000, 26))
('append :', 12, (100000, 26))
('append :', 13, (100000, 26))
('append :', 14, (100000, 26))
('append :', 15, (100000, 26))
('append :', 16, (100000, 26))
('append :', 17, (100000, 26))
('append :', 18, (100000, 26))
('append :', 19, (100000, 26))
('append :', 20, (100000, 26))
('append :', 22387, (22387, 26))