わかりました-stackOverflowへの最初の投稿を試みます...しかし、私はどこでも検索され、答えが見つからず、間違った方向に進んでいると確信しており、これは一般的な適用可能な質問だと感じているので、ここに行きます.
私はさまざまな種類のファイルを持つさまざまな計測器を扱っていますが、それらはすべて通常、データの保存にレコードベースのプロトコルを使用しています。例 - 各ファイルには一連のレコードが含まれ、各レコードには同期ビットを含むレコード タイプ ヘッダー、レコードの種類、およびレコードのサイズが含まれます。扱うファイルの種類ごとに継承およびカスタマイズできる、レコードベースのファイルを読み取るための汎用クラスを作成したいと考えています。通常、ファイルは非常に大きい (1GB) ため、効率が重要です。
これが私のクラスです。ファイル位置マーカーを使用してファイル内をジャンプしていますが、非常に遅いクラスを作成しているのではないかと心配しています。これは、データのサイズと量を考えると非常に重要です。間違ったトラック?
class RecordBasedFile(object):
syncpattern = '\xff\xff\x00\x00'
maxrecsize = 1024*64
recordIDfromSync = 28
recordSizefromSync = 4
def __init__(self,fileHandle):
self.fh = fileHandle
self.recordList = []
self.sync()
def sync(self):
abpos = self.fh.tell()
chunk = self.fh.read(self.maxrecsize)
syncbit = chunk.find(self.syncpattern)
if syncbit >=0:
self.fh.seek(syncbit+abpos)
return True
else:
return False
def checkSync(self):
result = self.fh.read(len(self.syncpattern)) == self.syncpattern
self.fh.seek(-len(self.syncpattern),1)
return result
def recordID(self):
return self.getField('<I',self.recordIDfromSync)
def recordSize(self):
size = self.getField('<I',self.recordSizefromSync)
return size
def record(self,yieldRecord = True):
abpos = self.fh.tell()
rsize,roffset = self.recordSize()
if yieldRecord:
self.fh.seek(abpos+roffset)
output = self.fh.read(rsize)
else:
self.fh.seek(abpos+roffset+rsize)
output = False
self.fh.seek(self.endofRecordtoSync,1)
return output
def fmtLength(self,Fmt):
fmt = Fmt.lower()
return 1 * fmt.count('b') + \
2*fmt.count('h') + \
4*(fmt.count('i') + fmt.count('f'))
def getField(self,fmt,offset):
abpos = self.fh.tell()
self.fh.seek(abpos+offset)
output = unpack(fmt,self.fh.read(self.fmtLength(fmt)))
self.fh.seek(abpos)
return output[0]
def __iter__(self):
return self
def next(self):
rid = self.recordID()
record = self.record(yieldRecord = rid in self.recordList)
if not self.checkSync():
self.sync
return rid, record