这是您在编程中会一次又一次遇到的经典案例:我是针对速度还是内存使用进行优化?
而且,就像所有这些难题一样,没有“正确”的答案或完美的解决方案。换句话说,你和你的同学在你解决问题的方法上都是正确的。
通过将所有记录加载到内存中的解决方案,您“消耗”内存以便在运行时更快地访问和修改每条记录。将所有记录存储在内存中的数组中会占用空间,但是由于内存访问几乎比磁盘访问快无限,因此您的方法将比您同学的方法运行得快很多。
相比之下,您的同学通过等待按需从硬盘加载数据来节省 RAM。但这会让她付出代价:与获取已经在内存中的数据相比,访问硬盘是一个非常昂贵的过程,而且每次用户进行更改时,她都会陷入困境。想想启动一个程序与切换到一个已经打开的程序需要多长时间。
这就是权衡。这里要问自己的一些重要问题是:
数据集(在您将要处理的常见配置中)是否太大(或将变得太大)而无法完全放入内存中?如果您正在处理通常是小型数据集,那么计算机现在有足够的 RAM,这可能是值得的。
您需要多快才能访问数据?实时访问重要吗?它是一个特别大或复杂的数据集,需要很长时间才能按需从硬盘加载?您的用户期望什么样的性能?
您的应用程序针对的是哪种系统?有时嵌入式系统和其他特殊情况需要他们自己独特的设计方法。您可能拥有丰富的 RAM 和非常有限的固定存储空间,或者您可能拥有完全相反的情况。如果您使用标准的现代 PC 硬件,您的用户想要/需要/已经拥有什么?如果您的大多数目标用户已经在使用相对“强大”的硬件,那么您可能会做出不同的设计决策,而不是针对更大的潜在受众——您肯定已经通过程序的表达系统明确地看到了这些权衡要求。
您是否需要考虑特殊情况?诸如多个用户并发访问之类的事情使将所有数据保存在内存中变得更加困难。其他用户如何能够读取仅存储在本地计算机内存中的数据?这里可能需要共享一个公共文件(甚至可能在共享服务器上)。
您的数据的某些部分是否比其他部分更频繁地访问?考虑将这些特定部分始终保留在内存中并延迟加载其余部分(这意味着,您仅在/如果用户访问它们时尝试将它们提取到内存中)。
正如最后一点所暗示的那样,某种平衡或组合的方法可能与您接近“理想”解决方案一样接近。您可以将尽可能多的数据存储在 RAM 中,同时在应用程序空闲状态期间定期将任何编辑或修改写回磁盘上的文件。一般程序花费大量时间等待用户做某事,而不是相反。您可以利用这些空闲的 CPU 周期将内存中的内容刷新回磁盘,而不会导致任何明显的速度损失。这种方法一直用于软件开发,有助于避免 EClaesson 的回答指出的陷阱。如果您的应用程序崩溃或以其他方式意外退出,其中大部分已经在幕后提交到磁盘。
后记:当然,Dark Falcon 的回答是正确的,在生产应用程序中,您很可能会使用数据库之类的东西来处理数据。但由于这似乎是出于教育目的,我认为了解每种方法背后的基本权衡更为重要。