Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Golang:致命错误:运行时:内存不足_Linux_Memory Management_Go_Out Of Memory - Fatal编程技术网

Linux Golang:致命错误:运行时:内存不足

Linux Golang:致命错误:运行时:内存不足,linux,memory-management,go,out-of-memory,Linux,Memory Management,Go,Out Of Memory,我正在尝试在中使用此包进行字符串匹配。我的字典是4MB。创建Trie时,我遇到了致命错误:运行时:内存不足。我使用的是Ubuntu14.04,内存为8GB,Golang版本为1.4.2 错误似乎来自第99行(现在):m.trie=make([]节点,最大值) 程序在这一行停止 这就是错误: fatal error: runtime: out of memory runtime stack: runtime.SysMap(0xc209cd0000, 0x3b1bc0000, 0x570a00,

我正在尝试在中使用此包进行字符串匹配。我的字典是4MB。创建Trie时,我遇到了
致命错误:运行时:内存不足
。我使用的是Ubuntu14.04,内存为8GB,Golang版本为1.4.2

错误似乎来自第99行(现在):
m.trie=make([]节点,最大值)

程序在这一行停止

这就是错误:

fatal error: runtime: out of memory

runtime stack:
runtime.SysMap(0xc209cd0000, 0x3b1bc0000, 0x570a00, 0x5783f8)
    /usr/local/go/src/runtime/mem_linux.c:149 +0x98
runtime.MHeap_SysAlloc(0x57dae0, 0x3b1bc0000, 0x4296f2)
    /usr/local/go/src/runtime/malloc.c:284 +0x124
runtime.MHeap_Alloc(0x57dae0, 0x1d8dda, 0x10100000000, 0x8)
    /usr/local/go/src/runtime/mheap.c:240 +0x66

goroutine 1 [running]:
runtime.switchtoM()
    /usr/local/go/src/runtime/asm_amd64.s:198 fp=0xc208518a60 sp=0xc208518a58
runtime.mallocgc(0x3b1bb25f0, 0x4d7fc0, 0x0, 0xc20803c0d0)
    /usr/local/go/src/runtime/malloc.go:199 +0x9f3 fp=0xc208518b10 sp=0xc208518a60
runtime.newarray(0x4d7fc0, 0x3a164e, 0x1)
    /usr/local/go/src/runtime/malloc.go:365 +0xc1 fp=0xc208518b48 sp=0xc208518b10
runtime.makeslice(0x4a52a0, 0x3a164e, 0x3a164e, 0x0, 0x0, 0x0)
    /usr/local/go/src/runtime/slice.go:32 +0x15c fp=0xc208518b90 sp=0xc208518b48
github.com/mf/ahocorasick.(*Matcher).buildTrie(0xc2083c7e60, 0xc209860000, 0x26afb, 0x2f555)
    /home/go/ahocorasick/ahocorasick.go:104 +0x28b fp=0xc208518d90 sp=0xc208518b90
github.com/mf/ahocorasick.NewStringMatcher(0xc208bd0000, 0x26afb, 0x2d600, 0x8)
    /home/go/ahocorasick/ahocorasick.go:222 +0x34b fp=0xc208518ec0 sp=0xc208518d90
main.main()
    /home/go/seme/substrings.go:66 +0x257 fp=0xc208518f98 sp=0xc208518ec0
runtime.main()
    /usr/local/go/src/runtime/proc.go:63 +0xf3 fp=0xc208518fe0 sp=0xc208518f98
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:2232 +0x1 fp=0xc208518fe8 sp=0xc208518fe0
exit status 2
这是主函数的内容(取自同一repo:test文件)


节点
类型的内存大小为
2084
字节。 我编写了一个小程序来演示内存使用情况:

如您所见,这三个字符串(大小为11(+1)字节)
字典:=[]字符串{“fizz”、“buzz”、“123”}
需要24 MB的内存

如果您的字典长度为4MB,则需要大约
4000*2084=8.1GB
的内存


因此,您应该尝试减小字典的大小。

节点类型的内存大小为
2084
字节。 我编写了一个小程序来演示内存使用情况:

如您所见,这三个字符串(大小为11(+1)字节)
字典:=[]字符串{“fizz”、“buzz”、“123”}
需要24 MB的内存

如果您的字典长度为4MB,则需要大约
4000*2084=8.1GB
的内存


因此,您应该尽量减少字典的大小。

您的结构在内存方面非常低效,让我们看看内部结构。但在此之前,请快速提醒一些围棋类型所需的空间:

  • bool:1字节
  • 整数:4字节
  • uintptr:4字节
  • [N] 类型:N*sizeof(类型)
  • []类型:12+长度(切片)*尺寸(类型)
现在,让我们看看您的结构:

type node struct {
    root bool        // 1 byte
    b []byte         // 12 + len(slice)*1
    output bool      // 1 byte
    index int        // 4 bytes
    counter int      // 4 bytes
    child [256]*node // 256*4 = 1024 bytes
    fails [256]*node // 256*4 = 1024 bytes
    suffix *node     // 4 bytes
    fail *node       // 4 bytes
}
好的,你应该猜一下这里发生了什么:每个节点的重量超过2KB,这是巨大的!最后,我们将查看用于初始化trie的代码:

func (m *Matcher) buildTrie(dictionary [][]byte) {
    max := 1
    for _, blice := range dictionary {
        max += len(blice)
    }
    m.trie = make([]node, max)

    // ...
}
你说你的字典是4MB。如果总共是4MB,则表示在for循环的末尾,
max=4MB
。它容纳4MB不同的字,然后
max=4MB*avg(字的长度)

我们将采用第一种方案,最好的方案。您正在初始化一个由4M个节点组成的切片,每个节点使用2KB。是的,这就需要一个漂亮的8GB

您应该回顾如何构建trie。在与Aho Corasick算法相关的wikipedia页面中,每个节点包含一个字符,因此从根节点最多有256个字符,而不是4MB


一些材料使其正确:

您的结构在内存方面非常低效,让我们看看内部结构。但在此之前,请快速提醒一些围棋类型所需的空间:

  • bool:1字节
  • 整数:4字节
  • uintptr:4字节
  • [N] 类型:N*sizeof(类型)
  • []类型:12+长度(切片)*尺寸(类型)
现在,让我们看看您的结构:

type node struct {
    root bool        // 1 byte
    b []byte         // 12 + len(slice)*1
    output bool      // 1 byte
    index int        // 4 bytes
    counter int      // 4 bytes
    child [256]*node // 256*4 = 1024 bytes
    fails [256]*node // 256*4 = 1024 bytes
    suffix *node     // 4 bytes
    fail *node       // 4 bytes
}
好的,你应该猜一下这里发生了什么:每个节点的重量超过2KB,这是巨大的!最后,我们将查看用于初始化trie的代码:

func (m *Matcher) buildTrie(dictionary [][]byte) {
    max := 1
    for _, blice := range dictionary {
        max += len(blice)
    }
    m.trie = make([]node, max)

    // ...
}
你说你的字典是4MB。如果总共是4MB,则表示在for循环的末尾,
max=4MB
。它容纳4MB不同的字,然后
max=4MB*avg(字的长度)

我们将采用第一种方案,最好的方案。您正在初始化一个由4M个节点组成的切片,每个节点使用2KB。是的,这就需要一个漂亮的8GB

您应该回顾如何构建trie。在与Aho Corasick算法相关的wikipedia页面中,每个节点包含一个字符,因此从根节点最多有256个字符,而不是4MB


一些材料使之正确:

将资源限制设置为无限为我工作

如果
ulimit-a
返回0运行
ulimit-c unlimited


可能会设置一个实际大小限制以更安全

将资源限制设置为“无限工作”

如果
ulimit-a
返回0运行
ulimit-c unlimited


也许设置一个真实的尺寸限制以便更安全

你的程序第66行有什么内容?顺便说一句,一般来说,问题需要包含足够的信息,以便在问题本身中回答;一个人们只能在点击github链接后才能回答的问题在技术上是违反这里的规则的,不过因为你已经得到了一些好的答案,所以这个问题不太可能结束。你的程序第66行有什么内容?顺便说一句,一般来说,问题需要包含足够的信息,以便在问题本身中回答;人们只有在遵循github链接后才能回答的问题在技术上是违反这里的规则的,但由于您已经得到了一些很好的答案,这不太可能被关闭。您不会通过减少条目的大小来修复损坏的数据结构,而是采取更有效的方法。是的,您是对的,我只是不想写“这段代码是垃圾,不要用它”…你不需要通过减少条目的大小来修复一个损坏的数据结构,你需要一个更有效的。是的,你是对的,我只是不想写“这段代码是垃圾,不要用它”…谢谢,我现在明白问题了。似乎效率更高,物质联系中断了。如果可能的话,你能更新它吗?谢谢。谢谢。我现在明白问题了。似乎效率更高,物质联系中断了。如果可能的话,你能更新它吗?谢谢