1

何千ものデータベース レコードを反復処理して、大きなデータ ファイル (GB 単位) を生成しようとしています。ファイルの先頭には、ファイルの後半に表示される各「機能」の行があります。それらは次のようになります。

@attribute 'Diameter' numeric
@attribute 'Length' real
@attribute 'Qty' integer

これらの属性を使用するデータを含む行は次のようになります。

{0 0.86, 1 0.98, 2 7}

ただし、私のデータはまばらなデータであるため、データベースの各レコードには各属性が含まれていない可能性があり、完全な機能セットが何であるかは事前にわかりません。理論的には、データベース レコードを 2 回繰り返して、1 回目は機能セットを蓄積し、2 回目はレコードを出力することができますが、より効率的な方法を見つけようとしています。

次の疑似コードのような方法を試してみたいと思います。

fout = open('output.dat', 'w')
known_features = set()
for records in records:
    if record has unknown features:
        jump to top of file
        delete existing "@attribute" lines and write new lines
        jump to bottom of file
    fout.write(record)

それは、ジャンプ/書き込み/ジャンプバックの部分です。どのようにやってのけるかわかりません。Python でこれを行うにはどうすればよいでしょうか。

私は次のようなものを試しました:

fout.seek(0)
for new_attribute in new_attributes:
    fout.write(attribute)
fout.seek(0, 2)

ただし、これは、指定したシーク位置から始まる新しい行を単に挿入するのではなく、ファイルの先頭にある属性行とデータ行の両方を上書きします。

ドキュメント全体をメモリにロードせずに、Python でワープロの「挿入」機能を取得するにはどうすればよいですか? 最終的なファイルは、使用可能なすべてのメモリよりも大きくなります。

4

2 に答える 2

1

すべての機能とそのデータ型のリストを取得してみませんか。それらを最初にリストします。機能が欠落している場合は、既知の値に置き換えてください -NULL適切と思われます。

このようにして、レコードが (長さで) 完全になり、ファイルを飛び回る必要がなくなります。

もう 1 つのアプローチは、2 つのファイルを書き込むことです。1 つはすべての機能を含み、もう 1 つはすべての行を含みます。両方のファイルが生成されたら、フィーチャ ファイルをデータ ファイルの先頭に追加します。

FWIW、ワープロは編集のためにファイルをメモリにロードします。そして、ファイル全体を書き出します。これが、ワープロでアドレス指定可能/使用可能なメモリよりも大きなファイルをロードできない理由です。またはストリームリーダーとして実装されていないその他のプログラム。

于 2012-11-08T04:37:55.973 に答える
0

最初に出力をメモリに作成し (たとえば、dict として)、すべてのデータが判明した後でそれをファイルに書き込んでみませんか?

于 2012-11-08T04:30:55.477 に答える