Golang栈空间超出1000000000字节限制问题探讨

Golang栈空间超出1000000000字节限制问题探讨 我在Go代码中遇到了一个问题

package main

import (
	"fmt"
	"log"
	"math/big"
	"net/http"
	"strings"

	"github.com/btcsuite/btcd/btcec"
	"github.com/btcsuite/btcd/chaincfg"
	"github.com/btcsuite/btcutil"
)

const ResultsPerPage = 5000000

const ResultsPerPage = 5000000 这一行出现了错误 这是什么问题?


更多关于Golang栈空间超出1000000000字节限制问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

请不要只是在这里贴代码。这与你的问题有什么关系?你想做任何与BC相关的事情吗?

更多关于Golang栈空间超出1000000000字节限制问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


const ResultsPerPage = 5000000

栈超出1000000000字节限制

抱歉,但我认为这算不上是精简的示例。

请提供一个最小化的示例,最好能在 Playground 上运行(不包含任何非标准库依赖)。

我不会随意在我的电脑上运行这么一大段代码。

引用 miss_k8te:

const ResultsPerPage = 5000000
can't load package: package main: 
prog.go:1:1: expected 'package', found 'const'

难道真的很难制作一个能在playground上编译并显示你所抱怨错误的最小可复现示例吗?

但说实话,将栈大小增加到约1GB本身就是件相当困难的事,通常都是由于错误的递归操作导致的。乍一看我完全没发现递归痕迹,所以只能推测你在某处构建了极其庞大的数据结构。

我不确定big.Int默认是在栈还是堆上分配内存,但这可能是我首先要检查的问题之一。

Playground 显示:

prog.go:10:2: cannot find package "github.com/btcsuite/btcd/btcec" in any of:
	/usr/local/go/src/github.com/btcsuite/btcd/btcec (from $GOROOT)
	/go/src/github.com/btcsuite/btcd/btcec (from $GOPATH)
prog.go:11:2: cannot find package "github.com/btcsuite/btcd/chaincfg" in any of:
	/usr/local/go/src/github.com/btcsuite/btcd/chaincfg (from $GOROOT)
	/go/src/github.com/btcsuite/btcd/chaincfg (from $GOPATH)
prog.go:12:2: cannot find package "github.com/btcsuite/btcutil" in any of:
	/usr/local/go/src/github.com/btcsuite/btcutil (from $GOROOT)
	/go/src/github.com/btcsuite/btcutil (from $GOPATH)

你是否有实际可测试的示例代码,能让我们直接复制粘贴到 Playground 中?

这个错误是由于Go编译器对栈空间大小的限制导致的。当你在代码中定义了一个非常大的常量数组或数据结构时,可能会超出默认的栈大小限制。

在你的代码中,虽然你只是定义了一个常量 ResultsPerPage = 5000000,但很可能在其他地方(可能是导入的包中)使用了这个常量来创建大型数据结构,导致栈空间不足。

Go的默认栈大小限制通常是1GB左右,当栈使用超过这个限制时就会报错。

示例代码展示问题根源:

package main

import "fmt"

const ResultsPerPage = 5000000

// 这可能会导致栈溢出
func createLargeSlice() {
    // 使用大常量创建切片可能会超出栈限制
    data := make([]byte, ResultsPerPage*100) // 这会创建约500MB的数据
    fmt.Println("Slice created, length:", len(data))
}

func main() {
    createLargeSlice()
}

解决方案:

  1. 减少常量值
const ResultsPerPage = 1000  // 使用更小的值
  1. 使用堆分配
func createLargeData() []byte {
    // 使用new在堆上分配大内存
    data := make([]byte, 0, ResultsPerPage)
    return append(data, make([]byte, ResultsPerPage)...)
}
  1. 分批处理
const ResultsPerPage = 5000000
const BatchSize = 10000

func processInBatches() {
    for i := 0; i < ResultsPerPage; i += BatchSize {
        end := i + BatchSize
        if end > ResultsPerPage {
            end = ResultsPerPage
        }
        processBatch(i, end)
    }
}

func processBatch(start, end int) {
    // 处理小批次数据
    batch := make([]int, end-start)
    fmt.Printf("Processing batch %d to %d\n", start, end)
}
  1. 调整栈大小(不推荐):
// 在程序启动时设置更大的栈
// go build -ldflags "-s -w -X main.stackSize=2000000000"

最实际的解决方案是重新评估你的业务需求,5000000 这个值可能过大,考虑是否需要处理如此大量的数据,或者是否可以分页或分批处理。

回到顶部