2016-02-01 12 views
6

目標巨大バイナリファイルのおおよそのサイズ1.3ギガバイトで変更特定のインデックス

読み取りおよび特定のビットと、その後(元のファイルを変更できない)別個のファイルに書き戻すを変更します。

私はそれが私のpythonを使用していますので、不変であるHEXフォーマットでエンコードされた大規模な文字列に格納されますバイナリファイルを読み込む方法

私のアルゴリズムはファイル全体をループし、変更が必要な文字列のすべてのインデックスをリストに格納します。 catchは、文字列内のすべてのインデックスを同じ値に変更する必要があるということです。私は不変の性質のためにこれを行うことはできません。私はこれを文字のリストに変換することはできません。なぜならそれは私の記憶の制約を吹き飛ばして、大変な時間を要するからです。実行可能なことは別の文字列に格納することですが、不変の性質のために文字列オブジェクトを大量に作成し、それらに連結し続ける必要があります。

私はhttps://waymoot.org/home/python_string/からいくつかのアイデアを使用しましたが、それは私に良いパフォーマンスを与えるものではありません。任意のアイデア、目標はインデックスリストの値によって決定される特定のプレースホルダを除いて、既存のスーパーロングストリングを別のものに正確にコピーすることですか?

+0

代替品は元のサイズと同じですか?私はあなたがファイルの位置を探して、ディスク上の場所に書き込むことができます。 –

+0

あなたは "それを書き戻す"と言うが、私の答えのコメントには "制約は元のファイルを変更しない"と言っている。それは矛盾です。 –

+0

質問の編集 - あいまいさの申し訳ございません –

答えて

5

だから、正直言ってファイルを文字列に読み込まないでください。実際に変更したバイト以外は特に書くべきではありません。 これは、リソースを無駄にするだけです。変更する必要がある場所を指摘して、ファイルを直線的に読み取っているように見えるからです。

あるレベルのmmapがサポートされているすべてのOS(Linux、OS X、* BSD、WindowsなどのUnixes)では、Python's mmapモジュールを使用してファイルを読み取り/書き込みモードで開くことができますそれをスキャンし、RAMに完全にロードしてから書き戻すことなく、その場所で編集することができます。愚かな例では、すべての12値のバイトを何らかの位置に依存して変換します:

注:このコードはMineであり、MITライセンスはありません。これはテキストを強調する目的で使用されるため、CC-by-SAの対象となります。この愚かな声明を必要とするSEに感謝します。

import mmap 
with open("infilename", "r") as in_f: 
    in_view = mmap.mmap(in_f.fileno(), 0) ##length = 0: complete file mapping 
    length = in_view.size() 
    with open("outfilename", "w") as out_f 
    out_view = mmap.mmap(out_f.fileno(), length) 
    for i in range(length): 
     if in_view[i] == 12: 
     out_view[i] = in_view[i] + i % 10 
     else: 
     out_view[i] = in_view[i] 
+0

これは良い解決策のようです制約は入力ファイルを変更できないため、別のプロセスにリンクする別のファイル形式に書き出す必要があります。それで、それを記憶の中で変えることは、私を良くしません。また、入力ファイルの一部は読み込み専用であり、私はmmapの許可を得ていません。他の提案はありますか? –

+0

あなたはまだそれらを読み込み専用にmmapし、内容を2番目のwriteonly mmapedファイルにコピーすることができます。それは私がやることです。 –

+0

そのアイデアを反映するように@johnsmithが更新されました –

0

文字列をスライスして、次のスライスに移動する前に、各スライスを変更してディスクに書き戻しますか?ディスクには集中力がありますか?

+0

私はそれを実際に試します。ディスクへの私の本来の仮定は、プログラムを大幅に遅くするでしょう。しかし、実際のパフォーマンスのトレードオフを見るのは興味深いかもしれません。 –

+0

通常、回答にはコード例のような詳細がいくつか含まれています。 – Trilarion

+0

はい、私はディスカッションを開始するコメントを残したかったが、十分な評判はありません... – Benares

関連する問題