概述是我正在编写代码来理解我的问题空间,并且我遇到了'PANIC:调用Lua API(内存不足)时出现无保护错误'错误.我正在寻找绕过这个限制的方法.
环境底线是Torch,一个在LuaJIT上运行的科学计算框架,LuaJIT在Lua上运行.我需要Torch,因为我最终想要在GPU上使用神经网络来解决我的问题,但为了实现这一目标,我需要很好地表达问题以提供给网络.我(卡住)在Centos Linux上,我怀疑尝试从32位模式重建源代码(据报道将LuaJIT内存限制扩展到4gb)将是一个噩梦,如果它适用于所有的库.
问题空间本身可能不是特别相关,但总的来说,我有点数据文件,我计算这些距离之间的距离然后bin(即直方图)这些距离试图找出最有用的范围.方便的是,我可以创建复杂的Lua表,其中包含各种箱子和torch.save(),这些都是数不清的,然后在以后拿起并检查不同的标准化等等 - 所以经过一个月的游戏后我发现这是真的很容易和强大.
我可以使它看起来最多3个距离,每个15个容器(15x15x15加上开销),但这只是通过添加显式的garbagecollection()调用并使用fork()/ wait()为每个数据文件,以便外部循环将保持运行,如果一个数据文件(几千)仍然打破内存限制并使孩子崩溃.当每个成功的子进程现在必须读取,修改和写入当前的bin计数集时,这会变得非常痛苦 - 我最大的文件目前是36mb.我想要更大(更多的垃圾箱),并且真的更愿意只持有15个我无法访问的RAM的计数.
所以,这里有一些我想过的路径; 如果你能确认/否认他们中的任何一个会/不会让我超出1gb边界,或者只是提高我的效率,请发表评论.如果您可以提出我没想过的其他方法,请发表评论.
我错过了一个触发Lua进程的方法,我可以从中读取任意表格吗?毫无疑问,我可以将我的问题分解成更小的部分,但是从stdio解析返回表(从系统调用到另一个Lua脚本)似乎容易出错,而写入/读取小型中间文件将是很多磁盘i/o.
我错过了一个存储和访问表高内存模块?这似乎是我真正想要的,但还没有找到它
FFI C数据结构可以放在1gb之外吗?看起来似乎并非如此,但我当然缺乏对造成限制的原因的全面理解.我怀疑这会让我比普通的Lua表更能提高效率,因为这些表已经超越原型设计了吗?(除非我为每个更改做了一堆编码)
当然我可以通过在C中写一个扩展来解决(Torch似乎支持超出限制的网络),但是我的简短调查发现了对'lightuserdata'指针的引用 - 这是否意味着更正常的扩展赢了也不到1gb以外?这看起来似乎也应该是原型制作练习的开发成本.
我很了解C,所以走FFI或扩展路线并没有打扰我 - 但我从经验中知道,以这种方式封装算法既可以非常优雅,又可以通过两个地方来隐藏错误.处理包含堆栈中表格中的表格的数据结构似乎也不是很好.在我做出这些努力之前,我想确定最终结果真的能解决我的问题.
感谢阅读长篇文章.