You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多进程下使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:57:53