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

Posted

技术标签:

【中文标题】处理复杂+大数据文件的建议【英文标题】: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
.....

【问题讨论】:

【参考方案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 的一对多关系。请为您的数据模型提交一个单独的问题,因为这是一个非常明显的问题。你应该先接受这个答案。

以上是关于处理复杂+大数据文件的建议的主要内容,如果未能解决你的问题,请参考以下文章

C#读取大数据量Excel,60W行数据,该怎么处理

java大概1000W数据导出成excel有啥好的建议。(最好是插件,POI、JXL、FastExcel已试过,数据量太大,不

在 pyspark 中处理大数据的优化

使用 JSON 对象解析和处理大文件的更有效方法

复杂任务中,流程的解耦设计

java 读取大数据文件,处理大数据文件性能比较?