1

わかりました-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           
4

0 に答える 0