2017-06-17 23 views
1

问题:
我有一个半大的[Int]数组,其中包含〜25K到60K元素。它最初是通过我的第一个程序输出到一个文本文件中的,并且需要将其作为let的值输入到第二个程序中。要做到这一点,我手动将其复制。但是,每当我尝试初始化它时,Swift都会冻结。通过冻结,我的意思是它什么都不做,即使在一个小时之后。Swift 3.1:数组太大而无法初始化? (程序只是冻结)

进一步调查:
我证实,这是阵列造成封河的大小,只用一行,只是说let test = [the_array]创建一个测试程序。该程序在一小时后仍在运行。

我以前使用包含400-450K元素的数组没有任何问题。但是,这些数组不必作为变量/常量初始化,每个元素只包含1-9之间的数字。导致冻结的数组肯定具有小于100K的元素,但每个元素都包含100-300K之间的整数。

我该如何将数组初始化为第二个程序,究竟是什么导致了这个问题?

其他信息:我在Ubuntu 16.04 64位上使用Swift 3.1.1,所以我没有访问Xcode的权限。如果你需要数组的文本文件,请留下评论。 File is uploaded here

+0

https://stackoverflow.com/a/31329368/7347933q – paper1111

+0

你给你的阵列显式类型:'让测试:[INT] = [ ...'?如果Swift不得不推断这种类型,那么对于大文字来说Swift就不太好。 – vacawama

+0

@vacawama哇,我从来没有想到这一点。我现在会尝试。 – Imagen

回答

0

我下载了你的文件 - 一个600KB的文件对于任何现代计算机来说都是非常小的尺寸。此代码在运行不到1秒钟对我的iMac 2012:

let fileURL = URL(fileURLWithPath: "/path/to/file.txt") 

let charset = CharacterSet.whitespacesAndNewlines.union(CharacterSet(charactersIn: "[]")) 
let fileContent = try! String(contentsOf: fileURL).trimmingCharacters(in: charset) 

let array = fileContent.components(separatedBy: ",").flatMap { 
    Int($0.trimmingCharacters(in: .whitespaces)) 
} 

print(array.count) // 74061 
+0

您的代码无缝工作。 Linux用户必须删除第一行,而是使用'let fileContent'直接从String(contentsOfFile:“file_location”)加载,因为URL似乎并未在Foundations for Linux中实现。似乎有1个问题。当传入[1,2,3,4,5,6,7,8]时,print(array)后面的代码给出值[2,3,4,5,6,7]。计数总是少于2。 – Imagen

+0

出于某种原因,'.union(CharacterSet(charactersIn:“[]”))'似乎没有任何效果。如果它适用于mac,它必须是Linux库问题。 '让charset = CharacterSet.decimalDigits.inverted'解决了这个问题。 – Imagen

+0

我现在不在电脑附近,但这是一个有趣的观察。您应该向Apple报告错误 –