Разница между чтением из памяти и чтением из файла на столе в производительности - PullRequest
0 голосов
/ 22 мая 2018

Я работаю над проектом ac #, где у меня есть несколько текстовых файлов (их размер около 30 МБ). Программа извлекает эти файлы из игрового клиента.затем сохраняет содержимое в памяти (списки) для работы.Итак, процесс, с которым я работаю:

  1. Разбор игрового клиента.
  2. Сохранение содержимого в виде txt-файлов в каталоге.
  3. Использование средства чтения потоков для чтения строки содержимогопострочно и сохраняю каждую строку в списках.

Но в итоге я использую свою программу с объемом памяти около 100 МБ, что довольно много, потому что программа предназначена для бота, который управляет несколькими учетными записями для этогоgame (ожидается 20 учетных записей, так что я думаю, что это около 2 ГБ оперативной памяти).

Было бы лучше, если я проанализирую игровой клиент, затем сохраню txt-файлы, а затем при необходимости прочту из txt-файлов, не сохраняя содержимое в памяти?или будет хуже по производительности?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете посмотреть на использование файлов с отображенной памятью.Они делают то, на что они похожи.Вы отображаете раздел памяти в файл на диске;Вы получаете доступ к памяти, но на самом деле вы касаетесь основного файла диска.Преимущества состоят в том, что вы обходите некоторые обычные (неэффективные) накладные расходы на файловый ввод-вывод, с которыми вы столкнулись бы, если бы использовали файловые операции .Net, и ваш код выглядит чистым, потому что вы просто делаете то, что всегда делаете- написание кода против объекта в памяти, не занимаясь написанием классов для чтения и записи файлов.

Один из способов, с помощью которого вы можете подумать о файлах с отображением в памяти, - это если вы знакомы с тем, как операционная система выполняет страницу в виртуальной памяти.Я обобщаю здесь, но это неплохая аналогия.

Взгляните на Работа с отображенными в память файлами в .Net

0 голосов
/ 22 мая 2018

Ответ ... это зависит от вашего варианта использования.

Если вы часто ссылаетесь на значения, которые хранятся в этих файлах во время работы программы, и эти файлы не слишком велики, обычно имеет смысл хранить их в памяти.Вы получаете НАМНОГО более быстрый доступ, чем чтение с диска.

Одним из наиболее часто используемых решений для такого рода проблем является использование кэша (например, если у вас было больше значений, чем вы могли бы реально сохранить в памяти).

Вы можете ограничить размер кеша и хранить там наиболее часто используемые переменные.Пусть ваша программа сначала попытается прочитать данные из кеша - если значение, которое она хочет, есть (хит), то работа выполнена.Если значение отсутствует (промах), оно будет извлечено с диска и помещено в кэш для дальнейшего использования.

Старые или менее часто используемые значения могут быть извлечены из кэша, если он начинает переполняться.

Если вы запускаете несколько экземпляров одной и той же программы с общими данными, вы используететакие программы, как Redis, как кеш, на который они все ссылаются.(т.е. один экземпляр 100 МБ вместо 100 МБ х количество ботов)

...