“python 的 file.flush() 到底在做什么?” 说你应该首先f.flush()然后os.fsync(f)确保数据写入磁盘。
此外,“在 Python 中,close() 是否意味着 flush()?” 声称f.close()意味着flush()。
现在,问题是:我应该做
os.fsync(f)
f.close()
Run Code Online (Sandbox Code Playgroud)
或者,f.close()也意味着os.fsync()?
下面是Python的IO的文档中,Python的文件关闭的文档,和源代码。快速搜索“fsync”未返回任何相关信息。
我有两个(POSIX)线程写入日志文件,如下所示:
pthread_mutex_lock(&log_mutex);
fprintf(LOG, "something...\n");
fsync(fileno(LOG));
pthread_mutex_unlock(&log_mutex);
Run Code Online (Sandbox Code Playgroud)
该文件被打开main()与fopen()与模式"一".当进程正在运行时,我看不到文件中出现的任何内容,cat或者tail虽然在进程终止并且文件为fclose()-ed之后,这些行都在那里.
我究竟做错了什么?
假设我在不执行fsync的情况下将块写入文件描述符,然后在一段时间后从同一个描述符中读取相同的块.它是保证,我会收到同样的信息?
该程序是单线程的,任何其他进程都不会随时访问该文件.
我正在尝试克隆tensorflow / models回购。我通过ssh连接到远程计算机。我尝试了许多解决该问题的建议,但没有一个对我有用。
git clone --recursive https://github.com/tensorflow/models.git
Cloning into 'models'...
remote: Counting objects: 1670, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 1670 (delta 10), reused 0 (delta 0), pack-reused 1642
Receiving objects: 100% (1670/1670), 49.23 MiB | 8.44 MiB/s, done.
Resolving deltas: 100% (670/670), done.
fatal: fsync error on '/home/OFFICE/utk/projects/syntaxnet/models/.git/objects/pack/tmp_pack_2w67RB': Input/output error
fatal: index-pack failed
Run Code Online (Sandbox Code Playgroud) 我们需要尽可能多的应用程序,保证在报告记录持续存在时,它确实是.我明白你要这样做fsync(fd).但是,由于一些奇怪的原因,使用fsync()会加速写入磁盘的代码,而不是像预期的那样减慢速度.
一些示例测试代码返回以下结果:
no sync() seconds:0.013388 writes per second:0.000001
sync() seconds:0.006268 writes per second:0.000002
Run Code Online (Sandbox Code Playgroud)
以下是产生这些结果的代码:
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
void withSync() {
int f = open( "/tmp/t8" , O_RDWR | O_CREAT );
lseek (f, 0, SEEK_SET );
int records = 10*1000;
clock_t ustart = clock();
for(int i = 0; i < records; i++) {
write(f, "012345678901234567890123456789" , 30);
fsync(f);
}
clock_t uend = clock();
close (f);
printf(" sync() seconds:%lf writes per second:%lf\n", ((double)(uend-ustart))/(CLOCKS_PER_SEC), ((double)records)/((double)(uend-ustart))/(CLOCKS_PER_SEC));
} …Run Code Online (Sandbox Code Playgroud) 我打算在log或diskqueue这样的系统中使用fdatasync.第一件事是在文件系统中创建一个带有"000000 ..."的10MB文件,如ext4.但我不知道如何正确地做到这一点.