Лучший способ использовать разделяемую память, которая может считываться напрямую разными процессами без накладных расходов на копирование.

У меня есть приложение, в котором инициализация включает чтение очень больших данных из файлов (~> 10 ГБ), а затем выполнение некоторых вычислений с этими данными (типа Dictionary). Шаг инициализации каждый раз занимает пару часов, хотя мои данные фиксированы/никогда не менялись. Что я хотел бы сделать, так это каким-то образом использовать процесс для предварительной загрузки этих данных в память, а другой процесс на том же компьютере для чтения непосредственно из него все данные только один раз и без какого-либо копирования. Пока нашел пару способов:

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

  • Файлы с отображением памяти. Этот вариант по-прежнему требует копирования данных, и в моем случае он не будет идеальным, поскольку мне нужно будет скопировать все> 10 ГБ данных. Я нашел несколько статей об использовании небезопасного доступа к адресам памяти, но я точно не знаю, как это работает.

  • Именованные каналы WCF. Этот подход похож на удаленное взаимодействие и по-прежнему требует передачи данных.

Какой самый эффективный способ для моего сценария?


person user1715925    schedule 19.07.2013    source источник


Ответы (2)


Если вы помещаете данные в словарь, почему бы не использовать какое-либо из популярных хранилищ значений ключей nosql (couchbase, riak, redis), тогда любой процесс может работать с данными. Если вы категорически не согласны с этой идеей, вы всегда можете использовать инфраструктуру NancyFx для размещения локальной конечной точки службы отдыха в приложении «Хост», тогда любые другие приложения, которым необходимо использовать предварительно загруженные данные, могут взаимодействовать со службами, предоставляемыми гостья.

person CSharpYouDull    schedule 19.07.2013
comment
Я не уверен, что это то, что мне нужно. Любая служба базы данных потребует запросов и передачи данных, а это не то, что я ищу. Мое приложение требует больших объемов данных и вычислений, поэтому мне нужно все в памяти, а не использовать специальные запросы, которые наверняка сильно повредят производительности. - person user1715925; 19.07.2013
comment
Если вы категорически против использования какой-либо базы данных, то я думаю, что лучше всего использовать автономный сервис, я предлагаю NancyFx, потому что его легко настроить и самостоятельно разместить, вы также можете использовать TcpListener/TcpClient для создания клиента серверные функции. - person CSharpYouDull; 19.07.2013
comment
Я не знаком с самообслуживанием, поэтому, пожалуйста, потерпите меня. Разве он по-прежнему не следует модели клиент/сервер и тем самым все равно выполняет копирование данных, когда клиент запрашивает его? Я искал что-то вроде прямого доступа к данным в памяти, как если бы они были созданы в том же процессе. Является ли это возможным? Пока что из моего исследования кажется, что файл с отображением памяти является ближайшим маршрутом. - person user1715925; 19.07.2013
comment
даже с файлом с отображением памяти вы все равно собираетесь создавать объект .net для работы, поэтому память будет использоваться, веб-служба отправит копию данных, но она вам все равно нужна, так что имеет ли это значение? - person CSharpYouDull; 20.07.2013

Я не знаю, как вы собираетесь эффективно хранить 10 ГБ данных в памяти. Какой бы подход вы ни выбрали, 10 ГБ данных в памяти будут слишком часто использовать системный кеш и замедлят всю вашу систему.

Я бы предложил использовать базу данных, если вы можете. Если вы не можете использовать базу данных, попробуйте сохранить ваши инициализированные данные и читать части по мере необходимости с некоторым кэшированием.

person bansi    schedule 19.07.2013
comment
На 64-битной ОС Windows Server с оперативной памятью серверного калибра (32 ГБ или более) это не должно быть проблемой, не так ли? Надежная машина не должна копировать память на диск, если есть лишняя память, и будет использовать системный кеш только после того, как он закончится, как мне показалось. - person welegan; 19.07.2013
comment
Я вот о том же подумал. не думал, что проблема с кэшированием. Если вы не согласны, можете ли вы уточнить проблему? - person user1715925; 19.07.2013
comment
Я не эксперт по управлению памятью Windows, но всегда видел слишком много свопинга на диск с окнами, даже если осталось много свободной оперативной памяти. Но если вам действительно нужно столько данных в памяти, то лучше всего хранить их в пространстве приложений, как вы это делаете сейчас. Единственное, что вы можете сделать, это никогда не закрывать приложение. Просто скройте его, когда пользователь закроет приложение. Так что только один раз загрузите, что в любом случае вам нужно с любым решением. - person bansi; 20.07.2013