在构建/运行执行期间出错

时间:2018-01-27 15:05:08

标签: go

我创建了一个简单的go脚本:https://gist.github.com/kbl/86ed3b2112eb80522949f0ce574a04e3

它从互联网上获取一些xml,然后启动X goroutines。 X取决于文件内容。就我而言,它是1700 goroutines。

我的第一次执行完成了:

$ go run mathandel1.go 
2018/01/27 14:19:37 Get https://www.boardgamegeek.com/xmlapi/boardgame/162152?pricehistory=1&stats=1: dial tcp 72.233.16.130:443: socket: too many open files
2018/01/27 14:19:37 Get https://www.boardgamegeek.com/xmlapi/boardgame/148517?pricehistory=1&stats=1: dial tcp 72.233.16.130:443: socket: too many open files
exit status 1

我试图将ulimit增加到2048年。

现在我得到了不同的错误,脚本与你相同:

$ go build mathandel1.go 
# command-line-arguments
/usr/local/go/pkg/tool/linux_amd64/link: flushing $WORK/command-line-arguments/_obj/exe/a.out: write $WORK/command-line-arguments/_obj/exe/a.out: file too large

导致该错误的原因是什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您运行private void ConfigureRoutes(IRouteBuilder routeBuilder) { routeBuilder.MapRoute( "Default", "{controller=Home}/{action=Index}/{id?}" ); } 更改了最大文件大小。

来自ulimit 2048man bash(1)部分:

  

如果没有给出选项,则假定为-f。

这意味着您现在将最大文件大小设置为ulimit字节,这对于任何事情都可能不够。

我猜你打算改变打开文件描述符数量的限制。为此,您要运行:

2048

对于原始错误(在更改最大文件大小之前),您将启动1700个goroutines,每个都执行一次http get。每个都使用tcp套接字创建连接。这些由开放文件描述符限制覆盖。

相反,您应该限制并发下载的数量。这可以使用简单的worker pool模式完成。