如何解决 MemoryError:Micropython 的内存分配失败?

Posted

技术标签:

【中文标题】如何解决 MemoryError:Micropython 的内存分配失败?【英文标题】:How to resolve MemoryError: memory allocation failed with Micropython? 【发布时间】:2020-10-14 10:40:29 【问题描述】:

我正在使用 pycom 的 SiPy 板进行项目,一切顺利,直到我实现了 2 个新文件(这不会修改项目行为本身),但在上传新文件并尝试运行我的代码后,它显示MemoryError: Memory allocation failed, allocating 136 bytes

我尝试使用os.fsformat("/flash") 清理电路板并再次上传项目,但我最终遇到了同样的错误。我还尝试解决“错误行”(只是导入另一个运行良好的类)并没有解决它,只是后来在另一个分配了不同字节的导入中发现了同样的错误。

【问题讨论】:

如何复制这种行为? 我检查了设备信息,尽管我有足够的闪存空间,但设备信息中的 RAM 或“内存状态”似乎已满,4MB/4MB,所以我猜任何带有已满 RAM 的板都会告诉同样的错误,我想知道如何清理 RAM 内存,因为它似乎是运行时的问题。 【参考方案1】:

根据您使用的 micropython 端口,您可以考虑使用:

import micropython

micropython.alloc_emergency_exception_buf(100)

早在boot.py 文件中?

【讨论】:

【参考方案2】:

如果您在目标设备上有足够的 RAM,您可能希望扩大 micropython 正在使用的堆大小。

查看micropython的内存数据:

$ micropython
>>> import micropython
>>> micropython.mem_info()
mem: total=3818, current=728, peak=1592
stack: 464 out of 40000
GC: total: 1024512, used: 816, free: 1023696
 No. of 1-blocks: 13, 2-blocks: 7, max blk sz: 8, max free sz: 63971

我的示例中的重要部分是free: 1023696。例如,我可以在 2MB 堆内存可用的情况下运行 micropython。为此,请使用以下选项:

$ micropython -X heapsize=2M
>>> import micropython
>>> micropython.mem_info()
mem: total=2620, current=542, peak=1406
stack: 464 out of 40000
GC: total: 2049088, used: 592, free: 2048496
 No. of 1-blocks: 8, 2-blocks: 6, max blk sz: 8, max free sz: 128019

【讨论】:

以上是关于如何解决 MemoryError:Micropython 的内存分配失败?的主要内容,如果未能解决你的问题,请参考以下文章

如何克服 numpy.unique 的 MemoryError

记录pip install torchvision MemoryError

场景应用:Java 出现 Out Of MemoryError(OOM 错误)的原因有哪些?出现 OOM 错误后,怎么解决?

尝试使用 itertools.permutations 时出现 MemoryError,如何使用更少的内存?

如何在没有 MemoryError 的情况下将 183,223,040x4 矩阵重塑为 140 个尺寸为 1145x1145 的矩阵?

Python实现协同过滤推荐算法,用的大一些的数据集就报错MemoryError