【发布时间】:2018-08-17 08:30:17
【问题描述】:
我需要创建两个大型 UInt8 数组以进行快速计算。 数组是这样创建的(都具有相同的大小):
let number = 1000 * 800 * 500
var data = Array(repeating: UInt8(0), count: number)
每次运行的常量“数字”都不同,但我举了一些例子来说明它通常有多大。 有时应用程序会因为内存不足而崩溃。
有没有办法预先检查是否有足够的内存可用于创建数组?我已经尝试过使用这样的“3d”数组:
var data = Array(repeating: Array(repeating: Array(repeating: UInt8(0), count: 1000), count: 800), count: 500)
这从未导致崩溃,因为系统不需要分配一大块连续的内存空间。然而,这个多维数组的性能要差得多。因此,这不是一个选项。
我尝试的另一个解决方案是使用:
data.reserveCapacity(number)
在创建之前,但这也没有阻止应用程序崩溃。 所以我很高兴听到一些建议,非常感谢您的帮助。
【问题讨论】:
-
不幸的是(据我所知)没有选项可以提前检查是否可以分配。即使
UnsafeMutablePointer.allocate()也不会返回一个可选的并且可能会崩溃,比较stackoverflow.com/q/47806012/1187415。 – 回退到 C 的malloc()可能 是一种选择,但即使这样也总是在某些平台上“成功”,并在实际使用内存时稍后陷入困境。 – 在 Swift 论坛中提问 forums.swift.org/c/swift-users 可能会有所帮助。
标签: ios arrays swift memory-management allocation