2016-02-01 35 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