2016-02-01 39 views
6

目標字符串更改特定的索引值相同蟒蛇

讀入一個巨大的二進制文件大小約爲1.3GB,並改變某些位,然後寫回一個單獨的文件(不能修改原始文件)。

方法

當我在它被存儲在十六進制格式是不可改變的,因爲我使用python編碼的大規模串二進制文件中讀取。

我的算法遍歷整個文件並將所有需要修改的字符串索引存儲在列表中。問題在於字符串中的所有索引都需要修改爲相同的值。由於不可變的性質,我無法做到這一點。我無法將其轉換爲字符列表,因爲這會炸燬我的記憶限制並花費很多時間。可行的做法是將其存儲在單獨的字符串中,但由於不可變的性質,我必須製作大量的字符串對象並繼續與它們連接。

我使用https://waymoot.org/home/python_string/的一些想法,但它並沒有給我一個好的表現。任何想法,目標是複製一個現有的超長字符串到另一個除了由索引列表中的值確定的某些佔位符?

+0

替換件與原件尺寸相同嗎?我可以查找文件位置並在磁盤上寫入。 –

+0

你說「寫回來」,但在我的回答評論說「約束是不改變原始文件」。這是一個矛盾。 –

+0

編輯問題 - 抱歉模棱兩可 –

回答

5

所以,說實話,你不應該把你的文件讀成字符串。除了實際改變的字節外,你不應該特別寫任何東西。 這只是浪費資源,因爲你似乎只是通過文件線性讀取,注意到需要修改的地方。

在所有支持mmap級別的操作系統上(即Unix,其中Linux,OS X,* BSD和Windows等其他操作系統),您可以使用Python's mmap模塊以讀/寫模式打開文件,掃描並編輯它,而不需要將其完全加載到RAM中,然後將其寫回。愚蠢的例子,轉換所有12值字節的位置相關的東西:

注意:此代碼是我的,而不是麻省理工學院許可。它用於文本增強目的,因此由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

你仍然可以將它們映射爲只讀文件,並將內容複製到另一個只寫入mmaped文件。這就是我要做的。 –

+0

@johnsmith更新以反映該想法 –

0

如何切分字符串,修改每個切片,然後將它寫回磁盤,然後再切換到下一個切片?磁盤密度過高?

+0

我會實際嘗試一下,我對內容的固有假設將會大大降低程序的運行速度。但看到實際的性能折衷可能會很有趣。 –

+0

通常情況下,答案包含一些更多的細節,如代碼示例,... – Trilarion

+0

是的,我想留下評論開始討論,但我沒有足夠的聲譽... – Benares