多进程下使用fseek/fwrite写入文件出现异常结果的原因排查
多进程通过fseek/fwrite写入文件不同区域的异常问题
问题概述
我希望让多个处理器通过fseek和fwrite写入文件的不同区域,此前了解到这种方案是可行的,但运行测试代码后却得到了不可预测的结果。
测试代码
C语言MPI实现代码
#include <stdio.h> #include <stdlib.h> #include <mpi.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); FILE *file = fopen("ranks.out","wb"); fseek(file,rank*sizeof(int),SEEK_SET); fwrite(&rank,sizeof(int),1,file); fclose(file); MPI_Finalize(); return 0; }
Python测试脚本
from numpy import fromfile, int32 import os import subprocess import sys P = 8 if len(sys.argv) == 1 else int(sys.argv[1]) print(f"Running on {P:d} processors.") arg_list = ['mpirun','-n',str(P),'stack_fseek'] output = subprocess.run(arg_list) print(output) stats = os.stat("ranks.out") print(f"File size : {stats.st_size:d} bytes") esize = 4*P print(f"Expected size) : {esize:d} bytes") fout = open("ranks.out","rb") r = fromfile(fout,dtype=int32) fout.close() print(r)
多次运行的异常结果示例
- 某次正常输出:
Running on 4 processors. CompletedProcess(args=['mpirun', '-n', '4', 'stack_fseek'], returncode=0) File size : 16 bytes Expected size) : 16 bytes [0 1 2 3]
- 文件大小未达到预期:
Running on 4 processors. CompletedProcess(args=['mpirun', '-n', '4', 'stack_fseek'], returncode=0) File size : 12 bytes Expected size) : 16 bytes [0 1 2]
- 数据被错误覆盖:
Running on 4 processors. CompletedProcess(args=['mpirun', '-n', '4', 'stack_fseek'], returncode=0) File size : 16 bytes Expected size) : 16 bytes [0 0 2 3]
疑问
为什么会出现这些不可预测的结果?上述代码本应正常工作吗?我是在MacOS上进行测试的。我尝试过不同的文件打开模式,但结果基本相同(部分模式下文件大小随每次运行增加)。我已经使用过MPI I/O,但希望找到一种基于fseek/fwrite的底层解决方案。
内容的提问来源于stack exchange,提问作者Donna
相关产品推荐
相关产品推荐

