Передача примитивных данных, таких как int, float-tuple: более эффективно анализировать строки или преобразовывать их в байтовый массив? - PullRequest
0 голосов
/ 20 октября 2018

При выполнении большого количества операций MapReduce мне бы хотелось, чтобы передаваемые данные имели как можно меньше накладных расходов.Одной из вещей, которые мне сейчас нужно передать, являются (int, float) кортежи, среди прочих.В настоящее время я пытаюсь выбрать один из двух способов передачи:

  1. Сериализация в строку, например, "4,3.4".Если я использую ASCII-US, я предполагаю, что размер передаваемого объекта, следовательно, будет просто количеством символов, необходимых для строковой формы, то есть, если мое целое число длинное или мое число с плавающей точкой точное, объект может стать довольно большим.

  2. Сериализация в байтовый массив: используйте 4 байта для целого числа, 4 байта для числа с плавающей запятой.Таким образом, я всегда буду использовать 8 байтов.Я мог бы использовать меньше со строкой в ​​особых случаях, но я предполагаю, что путь строки будет в среднем дороже.

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

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Это довольно сложный вопрос.

  • С одной стороны, (относительно) вычислительно дорого преобразовать число из двоичной в текстовую форму ... и обратно.Преобразование в десятичное число особенно дорого, потому что преобразования включают в себя повторное деление / умножение на 10.

  • С другой стороны, если значения данных (в среднем) малы, текстовое представление может (в среднем) занимают меньше байтов при кодировании.В зависимости от сквозной скорости и задержки в ваших сетях (включая сетевые адаптеры, виртуализация и т. Д.) Меньшее представление по проводам может привести к большей пропускной способности.

  • На третьемС другой стороны, это было бы спорным, если бы расходы на связь были незначительной частью общих вычислений.

Мой совет был бы:

  1. Остерегайтесь преждевременной оптимизации!
  2. Оцените две альтернативы (двоичную и текстовую) для кодирования + передачи + декодирования в вашей среде .Убедитесь, что вы делаете это с тестовыми данными, которые будут типичными для ваших фактических данных.
  3. Оцените приложение в целом.(Это предполагает, что вы обратили внимание на первый пункт!)
  4. Решите, будет ли разница в двоичном и текстовом представлении иметь значительную разницу с общей производительностьюзаполните заявку на реальных данных.
  5. Переработайте код ... если ваши измерения и т. д. скажут вам, что это будет стоить усилий.

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


Наконец ...

При выполнении большого количества операций MapReduce,Мне бы хотелось, чтобы передаваемые данные имели как можно меньшие накладные расходы.

Это не должно быть вашей целью.В действительности цель должна быть:

  • Сделать приложение в целом достаточно быстрым, чтобы соответствовать требованиям производительности.
  • Оптимизировать Время разработки не пытаясь достичь производительности сверх фактических требований.

Цели типа «как можно быстрее» или «как можно более эффективно» или «как можно меньше»может быть опасное усилие тонет.Вы должны стараться избегать их.

0 голосов
/ 20 октября 2018

Вы можете преобразовать данные в байты путем преобразования, используя формат ASCII или UTF-8.

Просто преобразуйте строку в байтовый массив и передайте формат как ASCII / UTF-8. Я бы порекомендовал UTF-8, потому что он будет поддерживать больше специальных символов, чем ASCII.

String s = "some text here";
byte[] b = s.getBytes("UTF-8");

Посредством десериализации вы можете легко преобразовать байтовый массив в строку.

...