Как обрабатывать большие наборы данных для симуляции на стороне сервера -> клиентский браузер - PullRequest
5 голосов
/ 21 июля 2010

Извините за несколько запутанный заголовок.Не уверен, как правильно назвать это.Моя ситуация такова - у меня есть инструмент академического моделирования, для которого я в процессе разработки веб-интерфейса.Хотя симулятор на основе C ++ в вычислительном отношении достаточно эффективен (от нескольких сотых до десятой доли времени выполнения) для небольших систем, он может генерировать значительный (с точки зрения веб-приложения) объем данных (~ 4-6 МБ).

В настоящее время настройка выглядит следующим образом:

  1. Пользователь получает доступ к файлу index.html.Эта страница слева имеет интерактивную форму, где пользователь может вводить параметры моделирования.Справа находится представление системы, которую они создают, а также неактивные вкладки для различных графиков данных моделирования.
  2. Пользователь нажимает кнопку «Выполнить моделирование».Это передает запрошенные параметры sim в файл runSimulation.php через вызов AJAX.runSimulation.php создает входной файл на основе представленных данных, а затем запускает симулятор, используя этот входной файл.Симулятор выплевывает 4-6 МБ данных в различные выходные файлы.
  3. Как только симуляция закончена, ответом на браузер является другая функция javascript, которая вызывает файл returnData.php.Этот сценарий php упаковывает данные в выходных файлах как данные JSON, возвращает данные JSON в браузер, а затем удаляет файлы данных.
  4. Эти данные ответа затем передаются на несколько графических объектов в javascript браузера,и вкладки сюжета становятся активными.Затем пользователь может открывать и взаимодействовать с построенными данными.

Эта установка работает нормально, однако я сталкиваюсь с двумя проблемами:

  • Возвращаемые данные медленно-Возвращение 4-6 МБ данных может занять некоторое время.(Эти данные распаковываются, что значительно сокращает их сторону, но при более медленном соединении это может занять более 20 секунд)
  • Следующая цель - дать пользователю возможность построить несколько прогонов симуляции, чтобы они могли сравниватьрезультаты.

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

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

1 Ответ

1 голос
/ 21 июля 2010

Для проблемы # 1 у вас нет вариантов.Вы уже распаковываете данные и используете JSON, который является относительно легким форматом.4 ~ 6 МБ данных - это действительно много.Кстати, если вы думаете, что PHP занимает слишком много времени для генерации данных, вы можете использовать вашу программу на C ++ для генерации данных и обрабатывать их с помощью PHP.Вы можете использовать exec () , чтобы сделать это.

Однако , я не уверен, как работают ваши симуляции, но Javascript является языком, полным по Тьюрингу, так что выможет генерировать некоторые / большинство / все эти данные на стороне клиента (что имеет больше смысла).В этом случае вы бы сэкономили много пропускной способности и значительно сократили бы время загрузки, но помните, что JS может быть очень медленным.

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

Чтобы отслеживать взаимодействие, вы можете использовать JS, чтобы проверить, активен ли пользователь (отправив пульс или что-то в этом роде).

...