Лучший способ отправить 10 000 пар по HTTP - PullRequest
1 голос
/ 20 февраля 2011

У меня есть клиентское приложение (iPhone), которое собирает 10000 пар.Я хотел бы отправить этот двойной массив через HTTP на сервер приложений (Java).Я ищу лучший способ сделать это.

Лучшее можно определить как некоторую комбинацию простоты программирования и компактности представления, поскольку объем данных может быть довольно большим.

Моя текущая идея заключается в том, что я преобразую весь массив двойных чисел.в строковое представление и отправить его в качестве параметра POST, на сервере проанализировать строку и преобразовать обратно в двойной массив.Кажется неэффективным, хотя ...

Спасибо!

Ответы [ 5 ]

4 голосов
/ 20 февраля 2011

Я думаю, что вы как бы ответили на свой вопрос :) Главное, на что следует обратить внимание, это различия между представлением с плавающей запятой на устройстве и сервере.В эти дни они оба будут иметь порядок байтов (в основном) IEEE-754.Тем не менее, все еще могут быть некоторые тонкие различия в реализации, которые могут укусить, например, обработка ненормальных и бесконечных, но вы, вероятно, можете избежать их игнорирования.Кажется, я вспоминаю, что некоторые крайние случаи в NEON (используемые в iPhone Cortex A-8) не обрабатываются так же, как x86.

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

Если вы хотите добиться некоторой эффективности в банковском переводе и на стороне устройства, то один из подходов - просто отправить двойные числав их необработанном двоичном виде.На сервере повторно обработайте их до двойных чисел (Double.longBitsToDouble).Убедитесь, что вы правильно указали порядок байтов, когда вы захватываете данные как длинные (это будет довольно очевидно, если это неправильно).

2 голосов
/ 20 февраля 2011

Я думаю, что есть много и много разных способов сделать это. Если бы это был я, я бы, вероятно, просто сериализовал бы в массив байтов, а затем закодировал бы его в base64, большинство других механизмов значительно увеличат объем передаваемых данных.

1 голос
/ 20 февраля 2011

10 Кбайт - это 80 Кбайт, двоичные байты - это около 107 Кбайт или около того символов в кодировке base64.Или 3 двойных это 24 двоичных байта это 32 base64 символа.Имеется множество исходных кодов примеров преобразования base64.

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

0 голосов
/ 20 февраля 2011

Если у вас есть рабочий метод, и вы не определили проблему с производительностью, то метод, который у вас есть сейчас, подойдет.

Не пытайтесь найти лучший способ сделать это, если вы не знаете, что это не соответствует вашим потребностям.

При проверке кажется, что на стороне java значение double (64 байта) будет составлять около 4 символов (16 байтов * 4). Теперь, когда я думаю о вашем среднем двойном значении, скажем, 10 цифр и десятичная точка, а также некоторый разделитель, например, точка с запятой, вы смотрите примерно 12 символов на десятичную точку. Это всего в 3 раза больше.

Итак, у вас изначально было 80 тыс. Данных, а теперь у вас 240 тыс. Данных. Разве это так много различий?

0 голосов
/ 20 февраля 2011

json

для кодирования iphone с помощью yajl-obj-c

и для чтения java с использованием jsonarray

...