.NET Можно ли разделить большую коллекцию в памяти между процессами? - PullRequest
2 голосов
/ 07 марта 2012

У меня есть консольное приложение, которое запускается сто раз в день и считывает одни и те же данные из больших файлов (скажем, 50 файлов с общим размером 3-4 Гб).

Я думаю о создании службы Windows, котораябудет кешировать данные в памяти для ускорения доступа, а также контролировать время жизни данных (так как набор из этих 50 файлов может изменяться день ото дня).

Я собираюсь реализовать сопоставленные файлы общей памяти, чтобыКонсольное приложение будет читать файлы из памяти, записанной службой ...

Однако есть и другое соображение.Считанные данные каждый раз преобразуются в объекты .NET.

Итак, мой вопрос - есть ли способ поделиться не файлами, а .NET объектами (списком) в памяти?

PSданные представляют собой серию байтов, сериализованных вручную

Ответы [ 4 ]

3 голосов
/ 07 марта 2012

Я бы просто реализовал это как сервис, который предоставляет сокет-сервер, и чтобы консоль exe просто подключалась к сервису и делала запрос по TCP / IP, получая ответ обратно.Довольно прост в настройке, так как у вас уже (по вопросу) сериализация отсортирована и очень масштабируема.Служба может поддерживать в памяти все, что работает счастливо.Вы даже можете иметь один и тот же exe-клиент и сервер - просто отметьте Environment.UserInteractive, когда он начнет решать, быть ли клиентом против сервера.

Одно замечание: поддерживайте низкую пропускную способность и избегайте болтливостиAPI;значение: не заставляйте клиента много думать, а затем отправьте 200 запросов;просто упакуйте весь запрос и отправьте его на сервер.Пусть сервер будет беспокоиться об этом локально, избегая большого сетевого трафика.

3 голосов
/ 07 марта 2012

есть ли способ поделиться не файлами, а объектами .NET (List) в памяти?

Быть разборчивым - нет, нет, выделенный объект находится в определенном процессе.

Вы можете использовать thighs как удаленное взаимодействие, но затем вы в основном делаете маршал доступа между процессами.

Вы можете разделять неуправляемое пространство (разделяемую память), но это не может содержать объекты .NET - требуется сортировка в них.

1 голос
/ 07 марта 2012
  • , если вы запускаете это приложение сто раз в день и ищете способ сохранить «данные» в памяти, почему бы вам не оставить приложение запущенным вместо его закрытия и перезапускаэто снова?

  • Вы можете создать службу Windows, которая загружает файлы в память и выполняет их разработку.Конечно, если вы остановите или перезапустите службу, ей потребуется перезагрузить данные

  • Другое решение состоит в том, что вместо сохранения в памяти объектов (что можно сделать только с помощью .Remoting иличто-то похожее) почему бы вам не импортировать файлы в базу данных, которая ускорит процесс, и его можно будет легко разделить между процессами?

0 голосов
/ 07 марта 2012

Насколько мне известно, вы не можете напрямую делиться коллекциями между несколькими процессами .NET, но придется маршалировать данные через границы процессов. Это приводит к значительным затратам ресурсов процессора и потребляет память для объектов как в процессе кэширования, так и на клиенте.

Вероятно, вы могли бы достичь чего-то более лучшего с файлами, отображенными в память, но это все же не позволяет вам напрямую сопоставлять объекты .NET в общей памяти - но вы говорите, что «данные представляют собой серию байтов, сериализованных вручную», поэтому это может быть достаточно близко?

Я не совсем понимаю, .NET отображаемые файлы памяти , отличная вещь от нативного кода в том, что вы просто рассматриваете файлы как указатели памяти, тогда как .NET MMF вам нужно вызывать методы доступа, и, следовательно, выполнять копирование памяти в объекты .NET (?) ... но, вероятно, это может работать лучше, чем чтение файлов снова и снова.

...