我正在写一个C++应用程序来分析IATA SSIM格式的航班时刻表。航空业组织IATA规定了用于在系统之间传输时刻表的文件布局标准,并且“SSIM”文件包含关于时刻表的信息,以及一家或多家航空公司的所有相应航班。
我设计了一个包含Flight对象集合的Schedule对象。输入文件中通常有2,000 - 20,000个飞行,结果对象的大小最大可达50MB。到目前为止,我读入了平面文件,并创建了结果Schedule对象,然后为了报告的目的对其进行分析/操作。
我的问题是-从设计的角度来看,这样做是可以的吗?让应用程序在我报告时将所有航班和时间表对象保存在内存中吗?另一种方法是在磁盘上保持飞行对象的序列化,并且只在我需要的时候处理内存中的活动记录。这将减少已使用内存的大小,但从编码的角度来看显然更麻烦。
我知道这方面没有“标准”的方法,但我想知道人们对在内存中管理一个非常大的对象的看法是什么。这是非常标准的设计,还是次优设计?我的首选是将所有内容都保存在内存中,并且在不使用序列化的情况下处理对象。
谢谢你们,皮特
发布于 2012-12-17 16:50:50
如果你可以将它们都保存在内存中而没有问题,那么就去做吧--其他的一切都是过早的优化。
要记住的重要一点是,以这样一种方式解耦算法和数据结构,以便以后可以切换到不同的策略,而不必重写应用程序逻辑。如果您的算法对航班列表上的迭代器进行操作,那么您可以稍后更改这些迭代器的逻辑(从内存读取,从磁盘读取),而不必修改算法。
发布于 2012-12-17 16:57:48
只使用内存的一个主要问题是,如果系统崩溃(无论是什么原因,不一定是代码错误),那么所有被操作的对象的数据都将丢失。如果你的处理速度比这更快,也许你能承担得起风险。
如果你想提供一个稳定的系统,那么它应该是可伸缩的,因为你永远不知道你的20K航班数据什么时候会变成200万航班数据,你可能需要为你的算法(更多的内存空间)等额外的数据结构。。对于这样的系统,最好使用存储机制来存储您的系统状态,以防在发生故障后需要从处理中途开始。
发布于 2012-12-17 17:09:22
磁盘慢得要死,而且不断地加载/卸载将会非常复杂。如果你没有耗尽内存,而且50MB对于现在的许多平台来说肯定不是很多,那么就把它们都留在内存中。
https://stackoverflow.com/questions/13910873
复制相似问题