【问题标题】:How to check if allocation is possible in Swift?如何检查在 Swift 中是否可以分配?
【发布时间】: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


【解决方案1】:

通常我们不会在设备上执行如此大量的计算和存储。 但是,如果您需要这样做,您无法连续保存如此大量的数据。

使用链表保存数据。由于链表不连续保存数据,因此只要设备上有可用内存,您就可以保存数据。

检查设备的存储空间,请参阅苹果文档。链接->Apple Doc.

【讨论】:

  • 感谢您的回答!但是,这些数组不必保存到本地内存。内存不足是指内存,而不是永久存储。澄清一下:我从文件中加载数据并使用数据创建一个数组以加快处理速度。
  • 上面还指定了 Uint8 对象的 RAM & 1000*800*500 为 3,814 字节。因此,使用数组或链接列表仍然无法将这些保存到 RAM 中。您可以使用链接列表和延迟加载来保存 Uint8 对象。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2022-11-18
  • 2012-08-06
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多