Swift 4创建超大数组导致电脑卡顿问题求助
为什么创建
Array(0...Int32.max)会让你的笔记本卡顿? 哈哈,这个坑我刚接触Swift的时候也踩过!咱们来拆解一下为什么这行代码会让电脑卡到怀疑人生。
核心原因:内存爆炸!
Int32.max的值是2147483647,也就是超过20亿个整数。- Swift的
Array是连续内存存储的容器,当你把这个范围转成数组时,系统会一次性为这20多亿个元素分配内存空间。在64位系统中,每个Int占用8字节,算下来总内存需求是:2147483647 * 8 ≈ 16GB! - 除非你的笔记本有远超16GB的内存,否则系统会立刻开始使用虚拟内存(把硬盘当内存用),而硬盘的读写速度比内存慢几个数量级,这就导致电脑卡顿、响应迟缓,甚至可能直接崩溃。
额外知识点:Range是懒加载的
你可能会好奇,为什么直接写0...Int32.max不会卡,但转成数组就卡?因为:
0...Int32.max是一个Range类型,它本身只存储起始值和结束值,不会提前生成所有元素,占用的内存可以忽略不计。- 但一旦调用
Array()初始化器,就会强制把Range里的所有元素都实例化并存储到连续内存中,这才是内存暴增的元凶。
解决办法:按需处理,避免全量加载
如果你只是需要遍历这个范围,完全不需要转成数组:
// 直接遍历Range,内存占用极低 for number in 0...Int32.max { // 在这里处理每个数字 }
如果确实需要使用数组形式,但不需要所有元素,可以:
- 只取前N个元素:
// 只生成前1000个元素,内存占用仅8KB左右 let first1000Numbers = Array((0...Int32.max).prefix(1000)) - 使用懒加载数组(不会提前生成所有元素,只有访问时才会计算):
let lazyNumbers = Array((0...Int32.max).lazy) // 只有当你访问lazyNumbers[index]时,才会生成对应位置的元素
下次遇到超大范围的集合操作时,先想想是不是真的需要把所有元素都存进内存里,毕竟内存可是电脑的“黄金资源”呀😉
内容的提问来源于stack exchange,提问作者Giuseppe Santaniello
相关产品推荐
相关产品推荐

