Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 传输诸如int、float元组之类的基本数据:更有效地解析字符串或转换为字节数组?_Java_Mapreduce_Bigdata_Byte - Fatal编程技术网

Java 传输诸如int、float元组之类的基本数据:更有效地解析字符串或转换为字节数组?

Java 传输诸如int、float元组之类的基本数据:更有效地解析字符串或转换为字节数组?,java,mapreduce,bigdata,byte,Java,Mapreduce,Bigdata,Byte,在执行大量MapReduce操作时,我希望传输的数据具有尽可能少的开销。我目前需要传输的东西之一是(int,float)元组,等等。我目前正在尝试选择两种传输方式: 序列化为字符串,例如“4,3.4”。如果我使用ASCII-US,我猜传输对象的大小将因此只是stringform中所需的字符数,即如果我的整数很长或浮点数很精确,对象可能会变得相当大 序列化到字节数组:int使用4个字节,float使用4个字节。这样,我将始终使用8个字节。在特殊情况下,我可以少用字符串,但我猜字符串方式平均会更昂贵

在执行大量MapReduce操作时,我希望传输的数据具有尽可能少的开销。我目前需要传输的东西之一是(int,float)元组,等等。我目前正在尝试选择两种传输方式:

  • 序列化为字符串,例如“4,3.4”。如果我使用ASCII-US,我猜传输对象的大小将因此只是stringform中所需的字符数,即如果我的整数很长或浮点数很精确,对象可能会变得相当大

  • 序列化到字节数组:int使用4个字节,float使用4个字节。这样,我将始终使用8个字节。在特殊情况下,我可以少用字符串,但我猜字符串方式平均会更昂贵


  • 因此,我目前倾向于第二种选择,尽管转换比串行化为字符串稍微复杂一些,但它应该更有效,对吗?

    您可以使用ASCII或UTF-8格式通过转换将数据转换为字节

    只需将字符串转换为字节数组,并将格式作为ASCII/UTF-8传递 我推荐UTF-8,因为它支持比ASCII更多的特殊字符

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

    通过反序列化,您可以轻松地将字节数组转换为字符串。

    您可以使用ASCII或UTF-8格式将数据逐个转换为字节

    只需将字符串转换为字节数组,并将格式作为ASCII/UTF-8传递 我推荐UTF-8,因为它支持比ASCII更多的特殊字符

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

    通过反序列化,您可以轻松地将字节数组转换为字符串。

    这是一个相当复杂的问题

    • 一方面,将一个数字从二进制形式转换为文本形式在计算上(相对)比较昂贵。。。然后回来。转换为十进制特别昂贵,因为转换需要重复10的除法/乘法

    • 另一方面,如果数据值(平均)小,则文本表示在编码时可能(平均)占用更少的字节。根据网络(包括NIC、虚拟化等)的端到端速度和延迟,较小的在线表示可能会带来更大的吞吐量

    • 第三方面,如果通信成本在总体计算中只是微不足道的一部分,这将是没有意义的

    我的建议是:

  • 小心过早的优化
  • 在您的环境中对编码+传输+解码的两个备选方案(二进制和文本)进行基准测试。确保您使用的测试数据是实际数据的典型数据
  • 将应用程序作为一个整体进行基准测试。(假设您注意到了第一点!)
  • 确定二进制与文本表示的差异是否会对真实数据上完整应用程序的总体性能产生重大影响
  • 重新编写代码。。。如果你的测量等告诉你,这将是值得的努力
  • 注意:如果测量结果告诉您二进制和文本之间的差异对于您的应用程序来说非常重要,那么这可能表明您的计算在通信和计算上花费了太多的时间。这将是值得一看,看看你是否可以减少沟通的数量;e、 g.通过改变计算的粒度或移动的数据量


    最后

    在执行大量MapReduce操作时,我希望传输的数据具有尽可能少的开销

    这不应该是你的目标。目标应该是:

    • 使整个应用程序运行得足够快,以满足性能要求
    • 通过不试图实现超出实际需求的性能来优化开发人员时间

    像“尽可能快”、“尽可能高效”或“尽可能小”这样的目标可能是危险的。你应该尽量避开它们。

    这是一个相当复杂的问题

    • 一方面,将一个数字从二进制形式转换为文本形式在计算上(相对)比较昂贵。。。然后回来。转换为十进制特别昂贵,因为转换需要重复10的除法/乘法

    • 另一方面,如果数据值(平均)小,则文本表示在编码时可能(平均)占用更少的字节。根据网络(包括NIC、虚拟化等)的端到端速度和延迟,较小的在线表示可能会带来更大的吞吐量

    • 第三方面,如果通信成本在总体计算中只是微不足道的一部分,这将是没有意义的

    我的建议是:

  • 小心过早的优化
  • 在您的环境中对编码+传输+解码的两个备选方案(二进制和文本)进行基准测试。确保您使用的测试数据是实际数据的典型数据
  • 将应用程序作为一个整体进行基准测试。(假设您注意到了第一点!)
  • 确定二进制与文本表示的差异是否会对真实数据上完整应用程序的总体性能产生重大影响
  • 重新编写代码。。。如果你的测量等告诉你,这将是值得的努力
  • 注意:如果测量结果告诉您二进制和文本之间的差异对于您的应用程序来说非常重要,那么这可能表明您的计算在通信和计算上花费了太多的时间。这将是值得一看,看看你是否可以减少沟通的数量;e、 g.通过改变c的粒度