处理复杂+大数据文件的建议

时间:2014-10-04 21:01:38

标签: objective-c performance loops core-data bigdata

我有一个非常大且复杂的数据文件(.txt,请参见下面的代码段)大约10MB,并且想知道存储它并在以后访问它的最佳方法。 我的应用程序目前使用核心数据存储其他实体,但由于其复杂性,我不知道如何从这种类型的数据文件创建实体。

此文件分为以下内容: 每个主要部分的第一行以A |开头并且意味着要定义一个新的“气道”。然后,这是它的名字,所以在下面的例子中我们有一个名为V320的气道和另一个名为V321的气道。在以下几行中,我们有重要数据,即构成此气道的“点”/航路点。每个人都有一个名字和坐标。所以这里的第一个是45.63N和-84.66W(坐标)的PLN。然后,从那里,下一个是LORIW,45.35N和-84.92W,LORIW我们去IROTO,等等......

注意:可能有两个,三个,甚至可能有4个具有相同“名称”的气道,例如V320,例如有3个......但每个气道都在地图中。

其他值无关紧要,例如坐标对后面的数字。

本质上,我需要这一切,以便我可以在我的地图上绘制线条(GMSPolyLine使用谷歌地图SDK),通过每个气道的所有这些点,然后为每个航路点创建GMSMarkers(谷歌版本的MKAnnotation)用户可以点击。 我可以在地图上处理线条/标记的绘制,但是我可视化的难点在于操纵这些数据并使其更容易访问。

如果您有任何问题,请与我们联系。

A|V320|20
S|PLN|045630647|-0084664108|LORIW|045352072|-0084924214|0|219|1998
S|LORIW|045352072|-0084924214|IROTO|045188989|-0085075111|219|219|1168
S|IROTO|045188989|-0085075111|ADENO|045030644|-0085220425|219|219|1132
S|ADENO|045030644|-0085220425|TIDDU|044877978|-0085359767|215|215|1090
S|TIDDU|044877978|-0085359767|SKIPR|044831714|-0085401772|215|215|330
.....

A|V321|29
S|PZD|031655206|-0084293100|KUTVE|031866950|-0084451303|0|329|1505
S|KUTVE|031866950|-0084451303|DUVAT|031948772|-0084512695|329|329|582
S|DUVAT|031948772|-0084512695|LUMPP|032041158|-0084582139|329|329|657
S|LUMPP|032041158|-0084582139|PREST|032176375|-0084684117|329|329|963
S|PREST|032176375|-0084684117|CSG|032615253|-0085017631|326|326|3129
S|CSG|032615253|-0085017631|JALVO|032722436|-0085064033|326|339|684
.....

1 个答案:

答案 0 :(得分:1)

您的数据表现出一定的规律性。如果它是可预测且一致的,只需编写一个遍历文件并创建适当的Core Data实体的解析器。

例如,每个新气道被换行分隔的事实可以帮助您找到这些。此外,除非您在气道记录的末尾,否则在下一行中重复每个最终航路点。我想你可以在20到30行的代码中做到这一点。

在您的开发机器上(或者甚至在iPad或最近的iPhone上),即使在内存中创建一个10MB的数组(待解析)也不应该成为约束。

如果数据是静态的,您可以将生成的sqlite数据库用作可以包含在应用程序包中的只读持久性存储。

对于解析器,它将是这样的:

NSString *file = [[NSString alloc] initWithContentsOfFile:fileURLString 
                 encoding:NSUTF8StringEncoding error:nil];

NSArray *lines = [file componentsSeparatedByString:@"\n"];
for (NSString *line in lines) {
    if (line.length < 1) { continue; }
    NSArray *fields = [line componentsSeparatedByString:@"|"];
    if ([fields.firstObject isEqualToString:@"A"]) {
        // insert new airway object and populate with other fields
    }
    else if ([fields.firstObject isEqualToString:@"S"]) {
        // insert new waypoint object (two for each first line)
        // assign as relationship to the current airway
        // and to another waypoint as necessary
    }
}
[managedObjectContext save:nil];