1

シーケンス情報のファイルがあるので、ファイルは次のように構成されます。

[SEQUENCE ID]
atgctagctagatcga
[SEQUENCE ID]
agatcgatggctagatc

私が行っているのは、ファイル間でIDが共有されているシーケンスを確認することです。これは非常に簡単ですが、IDに関連付けられている実際のシーケンスを引き出したいと思います。私が使用しているファイルは巨大(10 GB以上)なので、辞書など、システムメモリへのすべての行の読み取りを伴うものを使用することはできません。

基本的に、コードの目的は、ファイル1のシーケンスIDがファイル2に見つからない場合、ファイル1のシーケンスIDの後の行を返すことです。ヒントはありますか?

4

3 に答える 3

2

では、ラインNとラインN + 1だけが必要ですか?この場合、2行のチャンクでファイルを読み取ります。そうすれば、常にシーケンスIDとシーケンスの両方にアクセスできます。

from itertools import izip
with open('data.txt', 'r') as f:
    for line1, line2 in izip(*(iter(f),) * 2):
        print line1, line2
于 2013-02-18T12:13:20.977 に答える
0

簡単な答え:データシーケンスの1つをO(n)よりも適切に検索できるようにするには、サードパーティのPythonライブラリを使用する必要があります。

並べ替えられていない場合は、少なくとも1つのファイルを並べ替える必要があります。このように考えてください。ファイル1からシーケンスIDを取得し、それがfile2に存在しないかどうかを確認するには、すべてのファイルを読み取る必要があります。ファイルを1回読み取るよりもはるかに現実的ではありません。

並べ替えよりも、並べ替えられたデータをディスク上に保持して高速検索を提供し、それでも成長できるデータ構造があると便利です。これにより、すべてのユーザーと同様に、並べ替えも容易になります。最初のステップで行う必要があるのは、ファイル2のエントリを読み取り、次にこの成長する並べ替えられたディスク永続データ構造に挿入することです。

確かにこれを行うために独自のデータ構造をロールすることはできますが、ZODBのueをお勧めします-ZOPEのオブジェクト指向DATABSe、btreeフォルダーを使用し、「2行のデータ」をタスクの最小限のオブジェクトにします。

于 2013-02-18T12:24:43.587 に答える
0

[SEQUENCE ID]がメモリに収まり、データの大部分が実際にはシーケンス行にあると仮定します(提供されている例とは異なります)-ファイル(質問のfile2)を解析するオプションがあり、注釈を付けませんte [SEQUENCE ID]のみ-ただし、そのような各識別子のファイル位置。このアプローチにより、現在のワークフローの多くを中断することなく続行できます(データベースについて学習する必要があるなど)。

def get_indexes(filename):
    with open(filename, "rt") as file:
        sequences = {}
        while True:
            position = file.tell()
            id = file.readline()
            if not id:
                break()
            sequences[id.strip()] = position
            # skip corresponding data line:
            file.readline()
    return sequences

def fetcher(filename1, filename2, sequences):
    with open(filename1, "rt") as file1, open(filename2, "rt" as file2):
        while True:
            id = file.readline()
            data = file.readline()
            if not id:
                break
            id = id.strip()
            if id in sequences:
                # postion file2 reading at the identifier:
                file2.seek(sequences[id])
                # throw away id:
                file2.readline()
                data = file.readline()

            yield id, data

if __name__== "__main__":
    sequences = getindexes("/data/file2")
    for id, data in fetcher("/data/file1", "/data/file2", sequences):
        print "%s\n%s"% (id, data)
于 2013-02-18T13:16:19.087 に答える