У меня есть набор точек данных, каждый из которых описывается словарем. Обработка каждой точки данных является независимой, и я отправляю каждый в отдельное задание кластеру. Каждая точка данных имеет уникальное имя, а оболочка представления кластера просто вызывает сценарий, который принимает имя точки данных и файл, описывающий все точки данных. Затем этот скрипт обращается к точке данных из файла и выполняет вычисление.Быстрая сериализация JSON (и сравнение с Pickle) для кластерных вычислений в Python?
Поскольку каждое задание должно загружать множество всех точек только для получения точки, которую нужно запустить, я хотел бы оптимизировать этот шаг, выполнив сериализацию файла, описывающего набор точек, в легко извлекаемый формат.
Я попытался с помощью JSONpickle, используя следующий метод, сериализовать словарь, описывающий все точки данных в файл:
def json_serialize(obj, filename, use_jsonpickle=True):
f = open(filename, 'w')
if use_jsonpickle:
import jsonpickle
json_obj = jsonpickle.encode(obj)
f.write(json_obj)
else:
simplejson.dump(obj, f, indent=1)
f.close()
Словарь содержит очень простые объекты (списки, строки, поплавки и т.д.) и имеет в общей сложности 54 000 ключей. Размер файла json составляет ~ 20 мегабайт.
Загрузка этого файла займет около 20 секунд, что кажется очень медленным для меня. Я переключился на использование pickle с тем же самым точным объектом и обнаружил, что он генерирует файл размером около 7,8 мегабайта и может быть загружен через ~ 1-2 секунды. Это значительное улучшение, но по-прежнему кажется, что загрузка небольшого объекта (менее 100 000 записей) должна быть быстрее. Помимо этого, рассол не читается человеком, что явилось большим преимуществом JSON для меня.
Есть ли способ использовать JSON для получения аналогичных или лучших ускорений? Если нет, есть ли у вас другие идеи по структурированию этого?
(Правильное решение просто «разрезать» файл, описывающий каждое событие, в отдельный файл и передать его сценарию, который запускает точку данных в кластерной задаче? Кажется, это может привести к распространению файлы).
спасибо.
Большое спасибо за ваш информативный ответ, это было очень полезно. Какие базы данных вы бы рекомендовали в python? Я бы очень предпочел вещи, которые не требуют автономных серверов баз данных, или даже лучше, которые встроены в python, возможно, как sqlite - над теми, которые это делают. Любые мысли по этому поводу? Будет ли подход базы данных в Python соперничать с временем рассола для тестового примера словаря для ~ 50 000 ключей, где вам нужно нарезать определенную запись? Если я переключусь на БД, я напишу специальный код для сериализации в CSV, чтобы мои файлы могли быть доступны и прочитаны другими пользователями. – user248237dfsf
Если вы используете встроенную базу данных, тогда SQLite лучше, но, как и любая другая встроенная БД, она не купит вам никакой параллельной обработки, в этом случае большая производительность DB-подхода. Насколько сложно запускать процесс PostgreSQL? И СЕЙЧАС вы получаете идеальное распараллеливание доступа к данным и большую производительность. (Написание CSV или других форм в SQL DB и сброс содержимого базы данных обратно в любую вашу форму, это простая работа с простыми вспомогательными скриптами, конечно же - это независимый от того, какой механизм БД вы выберете). –