Это классический случай, с которым вы будете сталкиваться снова и снова в программировании: оптимизировать ли я скорость или использование памяти?
И, как и все такие загадки, не существует «правильного» ответа или идеального решения. Другими словами, вы и ваш одноклассник оба правы в своих решениях проблемы.
С вашим решением загрузки всех записей в память вы «тратите» память, чтобы ускорить доступ и изменение каждой из этих записей во время выполнения. Хранение всех записей в массиве в памяти занимает место, но поскольку доступ к памяти почти бесконечно быстрее, чем доступ к диску, ваш подход будет работать намного быстрее, чем у вашего одноклассника.
Для сравнения, ваш одноклассник экономит ОЗУ, ожидая загрузки данных с жесткого диска по запросу. Но это будет стоить ей: удар по жесткому диску - ужасно дорогой процесс по сравнению с извлечением данных, которые уже находятся в памяти, и она будет застревать, делая это каждый раз, когда пользователь вносит изменения . Подумайте, сколько времени потребуется, чтобы запустить программу, а не переходить на уже открытую.
И в этом заключается компромисс. Вот некоторые важные вещи, которые следует задать себе:
Является ли набор данных (в общих конфигурациях, с которыми вы будете иметь дело) слишком большим (или станет слишком большим), чтобы полностью поместиться в памяти? Если вы имеете дело с обычно небольшими наборами данных, у компьютеров теперь достаточно оперативной памяти, что, вероятно, того стоит.
Как быстро вы должны иметь доступ к данным? Важен ли доступ в реальном времени? Это особенно большой или сложный набор данных, который может занять слишком много времени для загрузки с жесткого диска по требованию? Какую производительность ожидают ваши пользователи?
На какую систему ориентировано ваше приложение? Иногда встраиваемые системы и другие особые случаи требуют своих уникальных дизайнерских подходов. У вас может быть изобилие оперативной памяти и очень ограниченный объем фиксированной памяти, или же вы можете иметь прямо противоположное. Если вы используете стандартное современное оборудование для ПК, что ваши пользователи хотят / нуждаются / уже имеют? Если большинство ваших целевых пользователей уже используют относительно «навороченное» оборудование, вы можете принять иные дизайнерские решения, чем если бы вы нацеливались на более широкую потенциальную аудиторию - вы наверняка видели эти компромиссы, ранее явные через систему выраженную программой требования.
Вам нужно учесть особые ситуации? Такие вещи, как одновременный доступ нескольких пользователей, значительно затрудняют хранение всех ваших данных в памяти. Как другие пользователи смогут читать данные, которые хранятся только в памяти на локальном компьютере? Возможно, здесь будет необходим общий файл (возможно, даже на общем сервере).
Существуют ли определенные части ваших данных, к которым обращаются чаще, чем другие? Подумайте о том, чтобы хранить эти конкретные части всегда в памяти и лениво загружать оставшиеся (то есть вы пытаетесь извлечь их в память только тогда, когда к ним обращается пользователь).
И, как намекает эта последняя точка, что-то сбалансированного или комбинированного подхода, вероятно, примерно так же близко, как вы найдете «идеальное» решение.Вы можете хранить как можно больше данных в ОЗУ, периодически записывая любые изменения или модификации в файл на диске во время состояния бездействия вашего приложения.В среднем программа тратит время на ожидание, чтобы пользователь что-то сделал, а не наоборот.Вы можете воспользоваться этими простоями циклов ЦП, чтобы сбросить данные, хранящиеся в памяти, обратно на диск без какого-либо заметного снижения скорости.Этот подход постоянно используется в разработке программного обеспечения и помогает избежать ошибок, на которые указывает ответ EClaesson.Если ваше приложение аварийно завершает работу или неожиданно завершает работу, вероятно, будет потеряна только очень небольшая часть данных, поскольку большая часть из них уже записана на диск за сценой.: Конечно, ответ Dark Falcon правильный, что в производственном приложении вы, скорее всего, будете использовать что-то вроде базы данных для обработки данных.Но поскольку это, по-видимому, для образовательных целей, я думаю, что понимание основных компромиссов, стоящих за каждым подходом, гораздо важнее.