Какой может быть лучший способ хранения значений Мандельброта в базе данных? - PullRequest
5 голосов
/ 05 сентября 2010

В настоящее время я экспериментирую с рендерингом набора Мандельброта и быстро понял, что было бы полезно не пересчитывать максимальное число итераций для каждого рендеринга ... с другой стороны, это много данныхследить за.Мне кажется (основываясь на моем ограниченном опыте работы с RDMS), что реляционная база данных, вероятно, не тот путь, потому что я не хочу, чтобы на производительность влияло увеличение набора данных.Это выглядит почти как идеальная ситуация для хеш-таблицы, но я никогда не использовал ее раньше и не могу понять, как использовать или управлять ею на одном из существующих языков веб-сервера (Python / PHP / что угодно).

Чтобы быть немного более явным: необходимо сохранить следующие важные значения:

  • исходная вещественная часть числа на комплексной плоскости
  • исходная мнимая часть числа на комплексной плоскости
  • Количество макс. Итераций
  • Число завершеноитерации n до достижения максимальных итераций или пока точка не уйдет в бесконечность
  • конечная вещественная часть числа на комплексной плоскости после n итераций
  • конечная мнимая часть числа на комплексной плоскости после n итераций

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

Так что вы думаете?Является ли хэш-таблица способом?Является ли проблема слишком сложной для простых смертных структур данных?

Любая помощь будет принята с благодарностью.Заранее спасибо!

Редактировать

Я немного разъясню эту проблему по доброй просьбе julienaubert.

У меня есть цельчтобы позволить пользователю увеличивать набор Мандельброта без задержки вычисления (даже если это происходит через предварительно определенные увеличения).Я также хочу иметь возможность делать это в браузере, который постоянно запрашивает у сервера новый массив данных, дающий новые координаты x и y, а также высоту и ширину для просмотра на комплексной плоскости.Однако, поскольку вычисление значения цвета пикселя может быть выполнено намного быстрее (с учетом max_iter, real_final и imag_final), а также, поскольку было бы неплохо разрешить пользователю настраивать параметры цвета, я собираюсь отправлять только браузерПеречислим переменные в моем посте, и пусть браузер пользователя вычислит цвет.

Взгляните на это:

http://jsfiddle.net/xfF3f/

Если вы посмотрите на drawMandelbrot(), вы можете видеть, что точечные циклы хранят важные значения в переменной, называемой набором данных.Затем эта переменная используется в функции drawMandelbrotFromData (), где она выполняет оставшиеся вычисления, необходимые для определения цвета для каждого пикселя.

Если вы нажмете «cleardabrot», он заменит холст белым прямоугольником.Если вы нажмете «refilldabrot», он снова запустит функцию drawMandelbrotFromData () ... это сделано для того, чтобы показать вам, насколько быстро он действительно может отобразить набор, если только он не должен был выполнять болезненные итеративные вычисления.

Таким образом, конечной целью здесь является возможность вычислить эти значения с произвольной точностью, чтобы пользователь мог увеличить масштаб до любого уровня набора, чтобы сервер выяснил, есть ли какие-либо данные для этих точных точек (или, предпочтительно,точки РЯДОМ с этими точными точками ... хотя я не уверен, как это можно сделать, не выполняя какой-либо запрос диапазона), а затем выкладываю информацию попиксельно.Например ...

  • Пользователь использует холст 300x300.
  • Он приближается к точке, где верхний левый угол равен x = .000001 и y = .0000231.
  • Его выбранные ширина и высота в этом кадре w = .00045 и h = .00045

Он отправляет эти числа на сервер и получает, в свою очередь, массив с 300 * 300 индексами (по одному на каждую точку), каждый из которых содержит необходимую информацию для определения цвета каждого пикселя на его холсте.Мой вопрос здесь ... каков наилучший способ хранения предварительно вычисленных данных Мандельброта, чтобы пользователь мог вводить произвольные значения x, y, w и h и быстро возвращать значения точек на комплексной плоскости в этомдиапазон.

1 Ответ

2 голосов
/ 05 сентября 2010

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

Из вашего вопроса не понятно, зачем вам это?Зачем вам нужно пересчитывать в одной и той же точке?

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

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

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

  • вычислить индекс (с учетом origo_real, origo_imag, max_iter)
  • загрузить кэшированныйвычисления (final_real, final_imag, actual_iter)
  • одно начальное хранилище

В зависимости от того, как вы будете повторно вычислять / повторно обращаться к одним и тем же точкам, вы можете разделить свою проблему на такиетаким образом, весьма вероятно, что индекс находится в справочной таблице, а справочная таблица достаточно мала для хранения в кэше L1 или L2.

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

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

ответ за обновление

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

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

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

Боюсь, что большинство запросов будет запрашивать патчи, которых не существует (поскольку возможен любой уровень масштабирования).Возможно, некоторая информация о том, как, например, работают Google Maps / GIS системы, может дать вам некоторые идеи.Если вашей основной проблемой является процессор, то, возможно, вы могли бы сделать это по-другому и позволить пользователю выполнять вычисления в апплете (и, возможно, отправить результат обратно)

Если вы делаете это, чтобы научиться кэшировать / вычислятьчерез клиент-сервер вы можете рассмотреть другую проблему, поскольку эта проблема может быть решена на стороне клиента любым приличным компьютером.

...