none
Как хранить объект RRS feed

  • Вопрос

  • Подскажите способ хранить объект. Граф данных с методами к ним, объёмом 1ГБ(читается сек 10 с жесткого диска), постоянно необходим в работе. Каким может быть решение??
    • Перемещено PashaPash 25 июля 2011 г. 14:25 вопрос по хостингу в IIS/DevServer (От:Работа с данными)
    23 июля 2011 г. 11:15

Ответы

Все ответы

  • Что значит хранить объект? Что такое 1ГБ?

    Для хранения графов обычно применяется матрица смежности. Для невзвешенного, неориентированного графа, матрицу смежности можно хранить в BitArray.

    23 июля 2011 г. 13:52
  • Индексирую 3 млн  строк длинною от 5 до 20 в простой граф: struct Leaf { public char ch; public List<int> shl, ndl; public List<Leaf> children; } к нему методы.. это на-ся объект. Можно, конечно, пользовать linq и т.д. дело вкуса, но смысл вопроса как Гб(ну, ладно, 400 Мгб) этого добра хранить в горячем состоянии , т.к. после пяти-десяти секунд чтения диска, актуальность графа умножается на ноль.

    23 июля 2011 г. 14:23
  • Ваш вопрос выглядит так: "как впихнуть объект 1ГБ в память 500МБ ?". Ответ очевиден - никак.

    Вам нужно либо увеличивать объем памяти, либо менять структуру объекта. Второй вариант конечно предпочтительнее.

    Если вы хотите компактную форму хранения, вам нужно отказаться от всех этих List<>, и от объектов Leaf тоже. Какая именно форма хранения подойдет - зависит от требований по скорости доступа и обновления данных. Меняются ли вот эти поля shl, ndl, children и как часто? Какая средняя длина списков shl, ndl, children ?


    23 июля 2011 г. 14:59
  • Любая другая структура данных будет медленнее для работы. Данные таковы и они не меняются, служат для поиска-анализа. Я не хотел компактной формы и тем более "впихнуть", а задал вопрос: "Господа, .." в смысле уровня программирования - не опускаться-же до ассемблера :).. У меня, предположим, 8 гб оперативной памяти. Эти данные как-то можно в о-й памяти хранить, не ужиматься?
    23 июля 2011 г. 15:17
  • Любая другая структура данных будет медленнее для работы.


    Это сомнительно. У вас обычные линейные структуры, и я не вижу за счет чего ваша организация данных может быть эффективнее любой другой линейной структуры. Но, раз вы не хотите оптимизировать структуру - хозяин-барин :)

    Кстати, тот объект который вы привели, вовсе не является графом. У вас Leaf это стуктура, а значит список List<Leaf> children хранит не ссылки, а копии значений. Фактически у вас там дерево, и скорее всего с кучей дублирующихся вершин.

    Попробуйте заменить struct на class, глядишь и проблемы с памятью исчезнут.


    23 июля 2011 г. 15:34
  • Дерево - это и есть граф, точнее простой граф. Структура ничем не отличается от класса в данном случае. Ни одна вершина не дублируется. Например две строки: мех, мат.
    Leaf { м -> е, а; } Leaf.childen { e -> х; а -> т } "У вас Leaf это стуктура, а значит список List<Leaf> children хранит не ссылки, а копии значений"
    это я, простите, как аргумент "не граф", вообще ничего не понял.


    23 июля 2011 г. 16:04
  • Ну просто когда говорят о графе, обычно подразумевают что вершины могут иметь произвольные связи. Ну да ладно.

    Так в чем собственно у вас проблемы? Выпадает Out of memory?

    23 июля 2011 г. 16:41
  • Да просто беда. У меня silverlight.sln (toylex.net), который, здесь подсказали, не бывает под 64 разрядную архитектуру. Это уже ограничевает рабочую память - 400 мгб не загружаются. Специфика веб-сервера iis7 такова, что он "сбрасывает" (не хранит) каждые двадцать минут данные, т.е. их опять необходимо читать, если с жесткого диска, то секунд десять.. В sql-express тот-же outofmemory. С workflow потратил кучу времени, решения не нашел. Мне нравитья идея windows-service, но не вижу как можно с ней работать, т.е. сделать запрос - получить данные. sql-server -это, я понимаю, та-же windows-service.
    23 июля 2011 г. 17:06
  • Есть кодер, который гигабайтный объект хранить может и работать с ним из внешнего процесса?! готов в Нилову пустынь пойти, если есть.. или все на sql "сидят", я уже тоже таблицы рисовать начал :(..
    25 июля 2011 г. 8:57
  • Специфика веб-сервера iis7 такова, что он "сбрасывает" (не хранит) каждые двадцать минут данные, т.е. их опять необходимо читать, если с жесткого диска, то секунд десять..
    Настрой recycling у application pool. рестарт после 20 минут нективности - это просто настройки по умолчанию.

    My blog | My Favorite Project
    25 июля 2011 г. 9:33
  • 432000 минут, уже получше. Теперь не знаю что с памятью будет происходить, имею ввиду прирост памяти с каждым новым клиентом iis..
    25 июля 2011 г. 10:12
  • к тому-же, т.к. silverlight.sln не бывает под 64 разрядную архитектуру, то не сможет поднять и 400 мгб данных.. т.е. не решение
    25 июля 2011 г. 10:43
  • Есть кодер, который гигабайтный объект хранить может и работать с ним из внешнего процесса?! готов в Нилову пустынь пойти, если есть.. или все на sql "сидят", я уже тоже таблицы рисовать начал :(..


    Вы до сих пор не можете сформулировать вашей проблемы. Какая ошибка выпадает? В какой момент и в какой точке кода? Покажите код. Что такое 1Гб(400мб)? Это размер в памяти, размер сериализованного файла или что? 32-битная ОС может адресовать до 4ГБ памяти. Так что ваше дерево вполне может поместиться в памяти.

    PS Хотя на самом деле это все бесполезно, пока вы не оптимизируете ваши структуры данных.

    25 июля 2011 г. 10:59
  • Делайте какой-нибудь бекэнд проект, silverlight работает же на клиенте, вы хотите каждому пользователю выгружать 1гб данных в браузер?


    Для связи [mail]
    25 июля 2011 г. 11:01
    Модератор
  • Уважаемый Дмитрий, большая просба указать мною сказанное из чего Вы пишите "вы хотите каждому пользователю выгружать 1гб данных в браузер".

    Silverlight.solution работает и на клиенте - .xap и на сервере - dll.

    25 июля 2011 г. 11:34
  • Насколько я понял вы хотите хранить в памяти древовидную структуру для эффективного поиска по ней. Не рассматривали вариант использования типа данных HierarchyId для хранения иерархии в базе данных? Поиск по иерархии в этом случае очень эффективен. При желании можно будет посмотреть сколько будет весить индекс, но думаю он будет компактнее текущего размера дерева. Плюс SQL Server в этом случае сам возьмёт на себя управление памятью.

    25 июля 2011 г. 11:37
  • Algol, вполне согласен, что теоретически "32-битная ОС может адресовать до 4ГБ памяти", но на практике создаю win application. 32 - ой вариант выдает "out of  memory",

    64 - й без притензий.

    25 июля 2011 г. 11:39
  • Почти закончил с таблицами sql для данных. Начинает даже нравиться, начинаю даже получать уовольствие, но что-то далеко в подсознании все слабее и слабее еще протестует-
    ты же из простого велосипеда данных сделал монстрообразного трансформера..но хаарош..

    В том все и дело, очень интересует можно ли в принципе обойтись без sql, загрузить в память большой объект один раз, как это делается при запуске приложения dll-й и постоянно с ним работать? Пусть даже этот вариант хуже чем в другой реализации.

    25 июля 2011 г. 11:52
  • На сервере - не silverlight. Обычное asp.net приложение. И оно поддерживает 64 бита и много памяти. Сильверлайт - только xap на клиентской стороне. Инфа 100%.
    My blog | My Favorite Project
    25 июля 2011 г. 12:30
  • На сервере - не silverlight. Обычное asp.net приложение. И оно поддерживает 64 бита и много памяти. Сильверлайт - только xap на клиентской стороне. Инфа 100%.
    My blog | My Favorite Project


    Т.е. создаем в VS10, например, new silverlight.sln и build SilverlightApplication1.Web делаем 64? У меня собирается проект, но при запуске выдает:

    Невозможно загрузить файл или сборку "SilverlightApplication1.Web" или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат.

    а у Вас?

    25 июля 2011 г. 12:41
  • Где именно выдает? Если на серверной стороне - переключи app pool в iis на 64 бита, как он был по умолчанию.
    My blog | My Favorite Project
    25 июля 2011 г. 13:11
  • Где именно выдает? Если на серверной стороне - переключи app pool в iis на 64 бита, как он был по умолчанию.
    My blog | My Favorite Project

    Создаем пока пустой silverlight.проект в VisualStudio: SilverlightApplication1/Property/Build/Any CPU and SilverlightApplication1.Web/Property/Build/x64. Здесь что надо переключить.
    25 июля 2011 г. 13:38
  • Создаем пустой silverlight проект. Все. По умолчанию все в AnyCPU, и серверная часть под IIS на x64 машине будет работать в 64-хбитном режиме.
    My blog | My Favorite Project
    • Помечено в качестве ответа ToylexNet 25 июля 2011 г. 14:21
    25 июля 2011 г. 13:48
  • Если серверную часть я собираю AnyCPU, то в отладчике VStudio она работает как 32-х разрядная, как запустить в VS как 64-х разрядную(сначала проект надо отладить), т.е. прочитать 400 мгб?

    25 июля 2011 г. 14:00
  • Создаем пустой silverlight проект. Все. По умолчанию все в AnyCPU, и серверная часть под IIS на x64 машине будет работать в 64-хбитном режиме.
    My blog | My Favorite Project

    Согласен, работать должно, но с VS пока не пойму в чем дело, и не совсем то, что хотелось бы.
    25 июля 2011 г. 14:20
  • Запускай студию под админом и переводи проект под IIS (там есть радиобаттон в свойствах проекта). Встроеный сервер студии тридцатидвухбитен. Или попробуй IIS Express.
    My blog | My Favorite Project
    25 июля 2011 г. 14:24