質問

numpy.memmap をマップすることは可能です。文字列の大きなディスクベースのアレイメモリに?

私はそれがフロートやそのようなもののために行うことができることを知っていますが、この質問は具体的には文字列について具体的です。

固定長さと可変長の両方の文字列の解決策に興味があります。

解決策は、妥当なファイル形式を自由に決定することができます。

役に立ちましたか?

解決

「配列」という用語で示されているように、すべての文字列の長さが同じである場合、これは簡単に可能です。 ジェネラコディセタグプレ

長さ10の文字列の例になります。

編集:文字列の長さが同じではないようです。O(1)アイテムにアクセスできるようにするには、ファイルにインデックスを付ける必要があります。これには、ファイル全体を1回読み取り、すべての文字列の開始インデックスをメモリに保存する必要があります。残念ながら、最初にメモリ内のファイルと同じサイズの配列を作成せずにインデックスを作成する純粋なNumPyの方法はないと思います。ただし、この配列は、インデックスを抽出した後に削除できます。

他のヒント

最も柔軟なオプションは、データベースやその他の複雑なディスクのファイル構造に切り替えることです。

しかし、あなたが物事をプレーンテキストファイルとして維持するのはおそらくいくつかの正当な理由があります...

ファイルの作成方法を制御するため、1つのオプションは、他のファイルの各文字列の開始位置(バイト単位)のみを含む2番目のファイルを単に書き出すことです。

これはもう少し仕事を必要とするでしょうが、あなたは本質的にこのようなことをすることができます:

class IndexedText(object):
    def __init__(self, filename, mode='r'):
        if mode not in ['r', 'w', 'a']:
            raise ValueError('Only read, write, and append is supported')
        self._mainfile = open(filename, mode)
        self._idxfile = open(filename+'idx', mode)

        if mode != 'w':
            self.indicies = [int(line.strip()) for line in self._idxfile]
        else:
            self.indicies = []

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        self._mainfile.close()
        self._idxfile.close()

    def __getitem__(self, idx):
        position = self.indicies[idx]
        self._mainfile.seek(position)
        # You might want to remove the automatic stripping...
        return self._mainfile.readline().rstrip('\n')

    def write(self, line):
        if not line.endswith('\n'):
            line += '\n'
        position = self._mainfile.tell()
        self.indicies.append(position)
        self._idxfile.write(str(position)+'\n')
        self._mainfile.write(line)

    def writelines(self, lines):
        for line in lines:
            self.write(line)


def main():
    with IndexedText('test.txt', 'w') as outfile:
        outfile.write('Yep')
        outfile.write('This is a somewhat longer string!')
        outfile.write('But we should be able to index this file easily')
        outfile.write('Without needing to read the entire thing in first')

    with IndexedText('test.txt', 'r') as infile:
        print infile[2]
        print infile[0]
        print infile[3]

if __name__ == '__main__':
    main()
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top