草庐IT

memory - Golang, fatal error : out of memory on 1 TB RAM machine

coder 2024-07-12 原文

我的代码包含一个巨大的 uint8 slice ,其中包含近 5.9 亿个元素。我将此数组保留在代码中以使其尽可能快地运行。代码的最终大小为 1.3 GB。

当我尝试编译它时,它引发了 fatal error :内存不足。与以下

# command-line-arguments
fatal error: out of memory

runtime stack:
runtime.throw(0x8fb3f2, 0xd)
    /usr/local/go/src/runtime/panic.go:566 +0x95
runtime.(*mcache).refill(0x7f5c2afa3ba8, 0x1440000000a, 0x7f57dc46d5e0)
    /usr/local/go/src/runtime/mcache.go:123 +0x160
runtime.(*mcache).nextFree.func1()
    /usr/local/go/src/runtime/malloc.go:505 +0x33
runtime.systemstack(0xc420044000)
    /usr/local/go/src/runtime/asm_amd64.s:298 +0x79
runtime.mstart()
    /usr/local/go/src/runtime/proc.go:1079

goroutine 1 [running]:
runtime.systemstack_switch()
    /usr/local/go/src/runtime/asm_amd64.s:252 fp=0x131f300c970 sp=0x131f300c968
runtime.(*mcache).nextFree(0x7f5c2afa3ba8, 0xa, 0x0, 0x131f300ca80, 0x1)
    /usr/local/go/src/runtime/malloc.go:506 +0xb2 fp=0x131f300c9c8 sp=0x131f300c970
runtime.mallocgc(0x90, 0x8ed060, 0x1, 0x115f3f9c)
    /usr/local/go/src/runtime/malloc.go:658 +0x809 fp=0x131f300ca68 sp=0x131f300c9c8
runtime.newobject(0x8ed060, 0xe00b46a450)
    /usr/local/go/src/runtime/malloc.go:785 +0x38 fp=0x131f300ca98 sp=0x131f300ca68
cmd/compile/internal/gc.Nod(0xd6c186c643, 0xfca1028090, 0xd6c186c480, 0x1)
    /usr/local/go/src/cmd/compile/internal/gc/subr.go:335 +0x31 fp=0x131f300cac0 sp=0x131f300ca98
cmd/compile/internal/gc.arraylit(0x0, 0x1, 0xc420663290, 0xfca1028090, 0x131f300d6c0)
    /usr/local/go/src/cmd/compile/internal/gc/sinit.go:698 +0x18f fp=0x131f300cb48 sp=0x131f300cac0
cmd/compile/internal/gc.slicelit(0x0, 0xc420663290, 0xfca1018000, 0x131f300d6c0)
    /usr/local/go/src/cmd/compile/internal/gc/sinit.go:765 +0xb36 fp=0x131f300cc58 sp=0x131f300cb48
cmd/compile/internal/gc.anylit(0x0, 0xc420663290, 0xfca1018000, 0x131f300d6c0)
    /usr/local/go/src/cmd/compile/internal/gc/sinit.go:1106 +0xac3 fp=0x131f300cd30 sp=0x131f300cc58
cmd/compile/internal/gc.oaslit(0xfca1017ef0, 0x131f300d6c0, 0xfca1018000)
    /usr/local/go/src/cmd/compile/internal/gc/sinit.go:1192 +0x104 fp=0x131f300cd60 sp=0x131f300cd30
cmd/compile/internal/gc.walkexpr(0xfca1017ef0, 0x131f300d6c0, 0x0)
    /usr/local/go/src/cmd/compile/internal/gc/walk.go:725 +0xe9c fp=0x131f300d5b8 sp=0x131f300cd60
cmd/compile/internal/gc.walkstmt(0xfca1017ef0, 0xfca1018090)
    /usr/local/go/src/cmd/compile/internal/gc/walk.go:192 +0xf45 fp=0x131f300d7f0 sp=0x131f300d5b8
cmd/compile/internal/gc.walkstmtlist(0x131f3184000, 0x21, 0x40)
    /usr/local/go/src/cmd/compile/internal/gc/walk.go:80 +0x4d fp=0x131f300d820 sp=0x131f300d7f0
cmd/compile/internal/gc.walk(0xc42065ccf0)
    /usr/local/go/src/cmd/compile/internal/gc/walk.go:65 +0x1e4 fp=0x131f300d8f0 sp=0x131f300d820
cmd/compile/internal/gc.compile(0xc42065ccf0)
    /usr/local/go/src/cmd/compile/internal/gc/pgen.go:391 +0x1d4 fp=0x131f300dba0 sp=0x131f300d8f0
cmd/compile/internal/gc.funccompile(0xc42065ccf0)
    /usr/local/go/src/cmd/compile/internal/gc/dcl.go:1287 +0x186 fp=0x131f300dc18 sp=0x131f300dba0
cmd/compile/internal/gc.Main()
    /usr/local/go/src/cmd/compile/internal/gc/main.go:467 +0x19f8 fp=0x131f300de60 sp=0x131f300dc18
cmd/compile/internal/amd64.Main()
    /usr/local/go/src/cmd/compile/internal/amd64/galign.go:93 +0x2fa fp=0x131f300de98 sp=0x131f300de60
main.main()
    /usr/local/go/src/cmd/compile/main.go:33 +0x2a3 fp=0x131f300df28 sp=0x131f300de98
runtime.main()
    /usr/local/go/src/runtime/proc.go:183 +0x1f4 fp=0x131f300df80 sp=0x131f300df28
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:2086 +0x1 fp=0x131f300df88 sp=0x131f300df80

我认为机器的 RAM 足以完成此类任务,但无法通过此问题。我用另一个包含 2100 万个元素的片段尝试了该代码,它运行良好。这是一项非常艰巨的计算任务,并且由于它需要非常快地运行,所以我不能使用外部文件来获取数据。

已经优化了变量类型。

有什么想法吗?

最佳答案

我以字节的形式从外部二进制文件加载数据。 @BJ Black 提供的以下代码有帮助。

    buf, err := ioutil.ReadFile("somefile.bin")
    if err != nil { panic(err.Error()) }
    // Coerce type
    uintbuf := []uint8(buf)

关于memory - Golang, fatal error : out of memory on 1 TB RAM machine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39089448/

有关memory - Golang, fatal error : out of memory on 1 TB RAM machine的更多相关文章

  1. ruby - 使用 WWW :Mechanize to download a file to disk without loading it all in memory first - 2

    我正在使用Mechanize来简化某些文件的下载。目前我的脚本使用以下行来实际下载文件...agent.get('http://example.com/foo').save_as'a_file_name'然而,这会将完整的文件下载到内存中,然后再将其转储到磁盘。你如何绕过这种行为,直接下载到磁盘?如果我需要使用WWW:Mechanize以外的东西,那么我将如何使用WWW:Mechanize的cookies呢? 最佳答案 您真正想要的是Mechanize::Downloadhttp://mechanize.rubyforge.org/

  2. ruby-on-rails - rails Assets 管道 "Cannot allocate memory - nodejs" - 2

    我们刚刚从Rails3.0.7升级到Rails3.2.5,并为暂存服务器即时使用Assets管道编译,但有时我们会遇到这个异常!Showing/var/rails/appname/app/views/common/_my_partial.html.hamlwhereline#raised:Cannotallocatememory-nodejs/tmp/execjs20120613-17090-thoc8f.js2>&1Extractedsource(aroundline#):Traceoftemplateinclusion:app/views/layouts/application.h

  3. ARM异常处理(3):Bus faults、Memory management faults、Usage faults、Hard faults详解 - 2

    之前介绍了了ARM异常处理(1):异常类型、优先级分组和异常向量表,里面有很多异常类型,其中有几个异常在错误处理中非常有用:文章目录1BusFault2MemoryManagementFault3Uagefaults4HardFaults1BusFault当在AHB接口上传输期间收到错误响应时,就会产生Busfault。它可能发生在以下几个阶段:指令预取阶段,通常称为prefetchabort数据读/写阶段,通常称为dataabort在Cortex-M3中,出现下面几种情况也会产生Busfault:堆栈在中断处理的开始处PUSH,称为stackingerror堆栈在中断处理的结束处POP,称为

  4. javascript - Node : Why pm2 list shows memory keeps on increasing? - 2

    我将HAPI.JS框架与NodeJS结合使用并创建了一个代理。认为代理意味着我只是在redis中维护session。除此之外,我没有在代码中做任何事情。可能唯一的问题是我每3分钟使用setInterval记录我的process.memoryUsage()。我的问题:为什么我的内存力一直在增加?它会下降吗?发生这种情况是否是因为setInterval不断记录进程使用情况?这是由于每个请求和响应的控制台日志记录导致的吗?我的Redis数据库一直保持打开状态,直到我的服务器崩溃,这是造成这种情况的原因吗?我是否需要使用流程管理器(如newrelic或strongloop)来识别它?那么这个内

  5. javascript - angular2-in-memory-web-api 404 错误 - 2

    我正在尝试按照本指南以Angular2构建5分钟的应用程序:https://angular.io/docs/ts/latest/tutorial/toh-pt6.html.在http部分,我添加了一个假服务器,但我收到404错误,因为angular2-in-memory-web-api.http://localhost:4200/vendor/angular2-in-memory-web-api/in-memory-backend.service.jsFailedtoloadresource:theserverrespondedwithastatusof404(NotFound)我试图

  6. JavaScript "cache"与 "memory" - 2

    如果您在Stackoverflow上搜索如何在JS中缓存变量,您会找到指向例如cookie或本地存储的答案。另一方面,“缓存”一词经常这样使用:“缓存数组的长度,这样我们就不必每次都计算它”。当然,我们不会在cookie或本地存储中缓存长度。我的问题是:“缓存”长度的位置在哪里?它在内存中吗?如果是这样,我们为什么要使用“缓存”这个词? 最佳答案 这是一个非常多的问题,看来您在这里混淆了很多概念。希望这有助于:对于您的问题““缓存”长度的位置在哪里?它在内存中吗?”给定某个值的任何变量都存储在内存中的特定位置。在JavaScript

  7. javascript - 是否可以在 headless chrome 中使用 window.performance.memory? - 2

    我想使用window.performance.memory来测量我的headlesschrome测试中是否有任何内存泄漏。在测试中:beforeEach(()=>{$('body').append(initHtml);console.log(window.performance.memory)});结果:MemoryInfo{}在开发控制台中:console.log(window.performance.memory)结果:MemoryInfo{totalJSHeapSize:27600000,usedJSHeapSize:16100000,jsHeapSizeLimit:153000

  8. javascript - 在 : memory allocation versus large object manipulation 中 - 2

    我有一个维护和操作大量数据的JavaScript模块。我有四个大型结构——每个基本上都是数组对象的对象的对象。他们里面有很多数据。当用户执行删除或更新等操作时,我需要遍历每个结构并可靠地修改结构以反射(reflect)更改。在某些结构中,根据用户操作,我不知道我需要更改哪个“叶”对象,所以我必须遍历所有对象,等等。在发生变化时操纵这些大型结构的另一种方法是将它们清空并从原始数据中重建它们。这就是我的问题:从性能的Angular来看,在Javascript中,循环遍历和修改现有(大型)数据结构或简单地从原始数据重建结构是否更优化?我确定答案可能是“视情况而定”,但是a)假设有大量数据;b

  9. javascript - Node : How to free buffers that get allocated outside of the V8 memory heap - 2

    我有一个应用程序,我按顺序从服务器下载mp3文件,将它们临时存储在我的服务器中,然后将它们直接流式传输到客户端,如下所示:functiondownloadNextTrack(){varrequest=http.get('http://mp3server.com',function(response){response.on('data',function(data){fs.appendFile('sometrack.mp3',data,function(err){});});response.on('end',function(){streamTrack('sometrack.mp3'

  10. Javascript 闭包 : Memory Leak - 2

    我有一个我不明白的内存泄漏。我编写了一种机制来处理半自动解除绑定(bind)的事件,这应该可以让我轻松清理内存。但在一种情况下,清理不会发生(我使用chrome的“配置文件(内存堆)”来检查是否有剩余的“EventHandler”实例)。我真的不明白为什么会这样。关闭有一些奇怪的东西......seeitinactionwithchromefunctionBind(obj,f){returnfunction(){returnf.apply(obj,arguments);}}functionEventHandler(){this.listeners=newObject();var_lis

随机推荐