|
|
1
4
最好的性能几乎总是通过写一个新版本的文件,然后让它原子地写旧版本来获得的,因为文件系统对这种顺序访问进行了强烈的优化,底层硬件也是如此(除了一些最新版本之外)
如果您接受这种理智的方法,一般的想法是:打开旧文件进行读取,打开新文件进行写入(创建);将N1字节从旧文件复制到新文件;然后跳过旧文件的N2字节;然后复制其余的字节;关闭两个文件;以原子方式将新文件重命名为旧文件。(Windows显然没有可以从Python中使用的“原子重命名”系统调用--为了保持完整性,在这种情况下,您需要执行三个步骤:将旧文件重命名为备份名称,将新文件重命名为旧文件,删除备份命名文件--如果在这三个非常快速的操作中的第二个操作中发生系统崩溃,只需一个重命名即可。)恢复数据完整性所需的时间)。
对于“复制其余部分”步骤,
shutil.copyfileobj
是最好的(一定要指定一个缓冲区长度,它可以很好地适应可用的RAM,但是
一个将倾向于提供更好的性能)。“跳过”这一步显然只是一个简单的步骤
|
|
|
2
0
我建议你 memory mapping 操作内存中的文件 它比将整个文件直接读入内存更有效。 嗯,您必须以某种方式操纵内存中的文件内容,因为无论是在*nix中还是在Win中都没有系统调用这种操作(至少我不知道)。 |
|
|
3
0
如果你真的想用手来做的话,选择一些块大小,做来回的读写。但是他们会杀了你。。。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |