gpt4 book ai didi

java - 传输原始数据,例如 int、float-tuple : More efficient to parse strings or convert to byte array?

转载 作者:行者123 更新时间:2023-12-02 01:51:44 25 4
gpt4 key购买 nike

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

  1. 序列化为字符串,例如“4,3.4”。如果我使用 ASCII-US,我猜测传输对象的大小将只是字符串形式所需的字符数量,即,如果我的整数很长或我的 float 很精确,则对象可能会变得相当大。

  2. 序列化为字节数组:int 使用 4 个字节,float 使用 4 个字节。这样我就一直使用 8 个字节。在特殊情况下,我可以减少对字符串的使用,但我猜测平均而言,字符串方式会更昂贵。

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

最佳答案

这是一个相当复杂的问题。

  • 一方面,将数字从二进制转换为文本形式……以及转换回来的计算成本(相对)昂贵。转换为十进制的成本特别高,因为转换涉及重复除/乘 10。

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

  • 从第三方面来说,如果通信成本在整个计算中只占微不足道的一部分,那么这就没有意义了。

我的建议是:

  1. 谨防过早优化!
  2. 在您的环境中对编码+传输+解码的两种替代方案(二进制和文本)进行基准测试。确保使用代表实际数据的测试数据来执行此操作。
  3. 对整个应用程序进行基准测试。 (这假设您注意了第一点!)
  4. 确定二进制与文本表示形式的差异是否会对完整应用程序在实际数据上的整体性能产生显着差异。
  5. 重新编写代码......如果您的测量结果等告诉您这是值得的。

注意:如果测量告诉您二进制与文本之间的差异对于您的应用程序来说实际上很重要,那么可能表明您的计算在通信与计算上花费了太多时间。看看是否可以减少沟通的是值得考虑的;例如通过更改计算的粒度或移动的数据量。

<小时/>

最后...

When doing a lot of MapReduce operations, I'd like the data that is transmitted to have as little overhead as possible.

这不应该是您的目标。目标实际上应该是:

  • 使应用程序作为一个整体运行得足够快,以满足性能要求。
  • 不要试图实现超出实际要求的性能,从而优化开发人员时间

像“尽可能快”、“尽可能高效”或“尽可能小”这样的目标可能会导致危险的努力损失。你应该尽量避免它们。

关于java - 传输原始数据,例如 int、float-tuple : More efficient to parse strings or convert to byte array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com