我们有一个HPC节点,它在其中运行我们的一些任务。我的.net项目中有一个任务,它在HPC节点上启动bcp实用程序,并将查询的输出运行到9 Mb。
当HPC节点运行此任务时,查询的输出被转储到一个文件中,然后在它转储大约5mb的数据后,它突然停止转储任何更多的数据,这种情况一直发生。 (请注意,这不是任何数据问题,因为它每次都不会在特定行上崩溃)。这可能有意义,也可能没有意义,但我将数据转储到具有足够权限的不同服务器中。
我在hpc节点和其他comps上直接运行了相同查询的命令,它给出了正确的输出。
我正在运行bcp命令,如下所示:
var processInfo = new ProcessStartInfo(“bcp.exe”,参数) { RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true, UseShellExecute = false };
var proc = new Process { StartInfo = processInfo, EnableRaisingEvents = true };
proc.Exited += new EventHandler(bcp_log);
proc.Start();
proc.WaitForExit();
所以我的代码实际上等待每个bcp任务在它继续运行之前运行,因为我多次调用它。
仅供我们再次提醒您,只有当我的o / p超过某个字节数时才会失败,大约5mb。
非常感谢任何帮助。
P.S:我想在所有hpc节点上添加bcp实用程序
答案 0 :(得分:2)
如果您将RedirectStandardOutput=true
更改为RedirectStandardOutput=false
,它仍会挂起吗?
如果上述更改避免了挂起,则可能遇到尝试通过.NET Process类重定向stdout和stderr流时可能发生的死锁情况。下面的MSDN文章更详细地解释了这一点,并提供了示例代码以异步读取stderr并避免死锁条件。
答案 1 :(得分:2)
嘿,这里的问题是HPC节点无法将bcp命令的输出重定向到标准输出。在这种情况下,标准输出具有最小值,在我们的情况下,当表中的行数超过50000时,它不再能够重定向到标准输出。在某些时间间隔明确刷新标准输出时,您仍然可以重定向到标准输出而没有任何问题