Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 19, 2008 17:29:46

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Ссылка/псевдоним объекта?

Согласен, говорит…, но всё равно бесполезно )).
Задача довольно распространенная - работа с сокетами. Должен быть эффективный способ.



Отредактировано (Июнь 19, 2008 17:32:33)

Офлайн

#2 Июнь 19, 2008 19:54:51

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Ссылка/псевдоним объекта?

А ты у своего StringIO после каждого write getvalue не бери. Не сложно считать длину накопившегося буфера отдельно.
Дальше. Пример непоказательный. Если у тебя обычно пакет за два раза приходит - используй специфический для этого случая алгоритм. Если пакет довольно большой - StringIO ощутимо выигрывает.

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

Далее. Если говорить о сокетах - использовать socket.recv_into никто не пытался?

Кажется, задачу решают не с того конца….



Офлайн

#3 Июнь 20, 2008 08:27:16

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Ссылка/псевдоним объекта?

Андрей Светлов
Кажется, задачу решают не с того конца….
Как обычно…



Офлайн

#4 Июнь 20, 2008 10:46:17

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Ссылка/псевдоним объекта?

Андрей Светлов
chunks, socket.recv_into
Буду копать в этом направлении. Кстати, что можно по этому поводу почитать?



Офлайн

#5 Июнь 20, 2008 11:14:51

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Ссылка/псевдоним объекта?

Офлайн

#6 Июнь 23, 2008 13:17:48

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Ссылка/псевдоним объекта?

Ferroman
Google
К сожалению, полноценной информации по этим функциям найти не удалось. Много ссылок, но мало примеров и описаний.



Офлайн

#7 Июнь 23, 2008 13:19:08

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Ссылка/псевдоним объекта?

Вот нашел похожий тест по способам быстрой конкатенации строк.
http://www.skymind.com/~ocrow/python_string/



Офлайн

#8 Июнь 23, 2008 15:21:53

PyCraft
От:
Зарегистрирован: 2008-05-23
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Ссылка/псевдоним объекта?

Нашел в тестинге питона пример использования recv_into, recvfrom_into

buf = array.array('c', ' '*1024)
nbytes, addr = self.cli_conn.recvfrom_into(buf)
msg = buf.tostring()[:LENGHT_MSG]
И мой тест(№7) работы с array с заливкой нулями и найденный в интернете тест(№3) на конкатенацию строк показали плохую производительность. Неужели в сочетании с recvfrom_into массив даст лучший результат, да еще с .tostring()? Подозреваю, там тот же самый способ заполнения buff=other.

Плохо то, что параметром эти функции принимают ссылку на array, а не адрес = POINTER(выражение). Следовательно, при каждом вызове массив будет заполняться сначала, а не с указанного адреса. В свою очередь это требует явного копирования массива для сохранения. Или я не прав?



Что-то никак не могу придумать какую пользу можно получить от recv_into, recvfrom_into

Вопросы, ответы, размышления:
1) Требуется ли резервирование памяти array.array('c', ‘\x00’*1024) перед вызовом recv_into(buf,1024) ?

2) Очевидно работать с указателями эти функции не умеют, тогда как организовать список таких массивов?
dict[`sock`]=[]
o=dict[`sock`]
o.append(array.array('c','\x00'*1024))
recv_into(o[0],1024)
3) Пусть список o…o создан. Заметим, что у каждого элемента, скорее всего, имеется хвост нулей или пробелов, в зависимости от инициализатора, и каждый элемент это массив. Заметим также, что 0 не является ограничителем, т.к. может являться частью данных. Чтобы выполнить объединение, потребуется определить актуальную длину каждого массива, обрезать хвосты, преобразовать к типу String и выполнить join и наверное в процессе всего этого не раз будет копирование…

4) Пусть мы как-то обошлись одним элементом списка и как-то научились работать с ним через указатель. Тогда мы должны определить максимально возможную длину массива и отвести для каждого открытого сокета максимальный буфер. Пусть максимальная длина сообщения будет 100Kb (небольшой селект из базы данных или что-то подобное). Пусть количество сокетов порядка 100000. Тогда для хранения буферов данных потребуется 10Гб оперативной памяти, большая часть из которой будет составлять “хвосты” из нулей. (В известных мне примерах на C обходятся 8Гб памяти на всё, с большим запасом и обрабатывают 250000 сокетов(в тестовом режиме) за 2-3 секунды.)

Как же работать с этими функциями эффективно?



Отредактировано (Июнь 23, 2008 18:45:50)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version