2015-06-15 4 views
0

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

В результате я мог бы иметь несколько экземпляров, например, класс DB, который извлекает данные БД данных и выгружает их в атрибут уровня класса. Тогда любой экземпляр, который нуждался в какой-либо из этих данных, имел бы доступ к нему, не переходя к кешу или сохраненному файлу в .

В настоящее время я отлаживаю класс аналитики, который захватывает данные БД с помощью неэффективных средств - в настоящее время я пытаюсь сделать намного быстрее. В настоящее время для загрузки данных DB требуется несколько минут. И формат, который я выбрал для данных с ndarrays и т. Д., Не хочет сохранять в файл через numpy.save (я не помню ошибку прямо сейчас). Каждый раз, когда я делаю небольшую настройку, данные теряются, и я должен ждать несколько минут, чтобы перезагрузить.

Поэтому мне пришла в голову мысль, что я могу создать простой класс для хранения этих данных. Класс, который мне не нужно будет изменять, может работать под отдельной консолью iPython (я использую Anaconda, Python 2.7 и Spyder). Таким образом, я мог бы связать класс analytics с общим классом данных в начале класса analytics. Что-то вроде этого:

def __init__(self): 
    self.__shared_data = SharedData() 
    self.__analytics_data_1 = self.__shared_data['analytics_data_1'] 

Идея заключается в том, что я бы тогда писать self.__analytics_data_1 внутри методов аналитики класса. Он будет автоматически обновляться до класса данных осколков. У меня была бы консоль iPython открытой, чтобы ничего не делать, кроме как держать экземпляр класса общих данных во время отладки. Таким образом, когда мне приходится перезагружать и восстанавливать класс аналитики, он просто получает все данные, которые я уже захватил. Очевидно, что если есть проблема с самими данными, ее нужно будет удалить вручную.

Очевидно, что я бы не хотел использовать один и тот же общий класс данных для каждого инструмента, который я построил. Но это легко обойти. Причина, по которой я упоминаю все это, заключается в том, что я не смог найти рецепт для чего-то подобного в Интернете. Там, кажется, много рецептов, поэтому я думаю, что отсутствие рецепта может быть признаком того, что это плохая идея.

Я попытался достичь чего-то подобного через Memcache в проекте PHP. Тем не менее, в этом проекте у меня было много чтений и написано, и оказалось, что код вызывал некоторую форму столкновения записи. Поэтому данные не обновлялись. (И Memcache не гарантирует, что данные будут даже там.) Предотвращение этого столкновения записи означало много дополнительного кода, дополнительное время обработки и, в конечном счете, код был слишком медленным, чтобы быть полезным. Я подумал, что могу попытаться снова использовать эту общую память в Python, а также использовать разделяемую память для целей отладки.

Мысли? Предупреждения?

+1

https://wiki.python.org/moin/UsingPickle? –

+0

Это первый проект, в котором я хотел сохранить что-то другое, кроме dict, в текстовый файл с кодировкой JSON.Я пытался использовать двоичный файл numpy, потому что я использую ndarrays. Я попробую мариновать и отчитаться. –

+0

Рассол имеет те же проблемы, что и numpy save для моего случая. В сущности, я Monkey Patch класс, который я построил для доступа SQL Alchemy к моей БД. Патч Monkey позволяет мне легко добавлять дополнительные данные. Но потом я получаю сообщение об ошибке: «PicklingError: не может pickle : это не тот же объект, что и db_base_config.Search_Stats_Mixin' –

ответ

0

Если вы хотите общие данные по экземплярам класса, вы должны сделать:

class SharedDataClass(object): 
    shared_data = SharedData() 

Этого экземпляр SharedData будет разделен между вашими экземплярами класса, если не переопределить в в конструкторе. Осторожно, блокировка GIL может повлиять на производительность!

Обмен данными «между консолями» или процессами - это разные истории. Это отдельные процессы, и, конечно, атрибуты класса не разделяются. В этом случае вам нужно IPC (это может быть файловая система, база данных, процесс с открытым сокетом для подключения и т. Д.)

+0

Я могу поклясться, что у меня есть атрибуты класса для совместного использования данных через консоли iPython до , Кажется, что сейчас это не так (Ubuntu 14.04). Раньше я развивался в Spyder на Win7. Разве может быть разница? –

+0

Обмен данными «между консолями» - это разная история. Это отдельные процессы, и, конечно, атрибуты класса не разделяются. В этом случае вам нужен IPC (это может быть файловая система, база данных, процесс с открытым сокетом для подключения и т. Д.). –

+0

О «попытке добиться чего-то подобного через Memcache в проекте PHP». Вы ищете что-то вроде «атомных обновлений»? Не могли бы вы вкратце объяснить, что вам нужно? Какие данные должны быть «кэшированы/обновлены»? –

Смежные вопросы