【问题标题】:Writing a file from buffer by probing, C program通过探测从缓冲区写入文件,C 程序
【发布时间】:2015-03-13 20:05:41
【问题描述】:

我正在使用以下代码将模拟输出写入文件

sprintf(filename, "time_data.dat");
FILE *fp = fopen(filename,"w");
for(i=0;i<ntime;i++){
    compute_data();
    fprintf(fp, "%d %lf %lf \n", step, time_val ,rho_rms);
}
return;

在我的桌面上,我可以看到文件 time_data.dat 每隔几个小时更新一次(compute_data() 每个时间步需要几百秒,在 i7 机器上使用 OpenMP)。我现在已将作业提交到集群节点(运行 ubuntu 服务器的 E5 2650 处理器)。我已经等了5天了,文件中还没有出现一行。我愿意

tail -f time_data.dat

检查输出。模拟还需要几周时间才能完成。我迫不及待地想看看我的输出是否好。有没有办法可以探测节点中的操作系统以刷新其缓冲区而不干扰计算?如果我现在取消工作,我肯定不会有任何输出。 请注意,写入输出文件的硬盘是使用 NFS 在多个节点和主节点上共享的硬盘。这会造成什么麻烦吗?是否有一个临时文件位置实际上正在写入输出?

PS:我做了 du -h 来找到显示大小为 0 的文件。我还尝试了 ls -l proc/$ID/fd 来确认文件确实打开了。

【问题讨论】:

  • 只是一个建议:检查fopen()是否成功。
  • 如果你这样做du -h time_data.dat会发生什么?
  • 当我执行 du -h 时,我得到 '0 time_data.dat' 作为输出。

标签: c file io buffer flush


【解决方案1】:

您可以使用lsof 或简单地使用ls -l /proc/$(pidof yoursimulation)/fd 来检查(在集群节点上)time_data.dat 确实已打开。

对于这样长时间运行的程序,我认为值得考虑使用:

  • application checkpointing技术
  • persistency 您的应用程序数据,例如在某些数据库中
  • 设计某种方式来查询应用的状态(例如使用一些 HTTP 服务器库,例如 libonion,或者至少有一些 JSONRPC 或其他服务来查询有关状态的信息)

【讨论】:

  • 看起来文件确实打开了,因为以下是您建议的命令的输出:total 0 lrwx------ 1 cluster cluster 64 Jan 16 00:16 0 -> / dev/pts/1 lrwx------ 1 集群集群 64 Jan 16 00:16 1 -> /dev/pts/1 lrwx------ 1 集群集群 64 Jan 16 00:16 2 -> / dev/pts/1 l-wx----- 1 cluster cluster 64 Jan 16 00:16 3 -> /home/cluster/Simulations/RUN_3D/time_data.dat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2021-11-23
  • 2018-08-25
相关资源
最近更新 更多