【问题标题】:Suggestions to Process Complex + Large Data File处理复杂+大数据文件的建议
【发布时间】:2014-10-04 21:01:38
【问题描述】:

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

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

注意:可能有两个、三个甚至 4 个具有相同“名称”的航空公司,例如 V320 有 3 个......但每个都在地图的自己的部分。

坐标对后面的数字等其他值无关。

本质上,我需要所有这些,以便我可以在我的地图上画线(使用谷歌地图 SDK 的 GMSPolyLine),这些线穿过每个航路的所有这些点,然后为每个航路点创建 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
.....

【问题讨论】:

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


    【解决方案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];
    

    【讨论】:

    • 我已经在我的应用程序包中包含了一个默认的 sqlite 数据库,以便在首次运行时复制到文档中,从而加快速度。但是,我对如何编写这个解析器仍然有点模糊......对于 Obj C 中的这类工作来说仍然相对较新。
    • 感谢代码 sn-p。好的,我现在了解如何处理文件,但是我将在 Core Data xcdatamodel 中创建什么类型的实体?它必须是一个数组,我存储在包含所有航路点的“航道”的每个实体中?
    • 您有从 Airway 到 Waypoint 的一对多关系。请为您的数据模型提交一个单独的问题,因为这是一个非常明显的问题。你应该先接受这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多