V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RangerWolf
V2EX  ›  程序员

分享一个关于 Int 占几位的真实优化案例, 顺便发个广告: 招大数据实习生!

  •  
  •   RangerWolf · 2015-10-16 21:04:28 +08:00 · 3566 次点击
    这是一个创建于 3337 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不撕逼,只描述一个自己遇到的事情而已。 大概描述一下吧~

    搞一个 Cassandra 集群,第一次玩,数据类型用的 Long/BigInt. 因为还在项目验证阶段,所以机器配置参差不齐。 有两台机器最搓, 只有 2G 的内存,泪崩。
    聊胜于无,也把环境搭建起来了。
    然后塞了几十 GB 的数据进去之后,就开始用 spark 去计算了~

    不出所料,很快就 Cassandra 奔溃了。。。。

    于是乎想起 long 的长度肯定要大于 int ,如果没有记错,应该是 32bit , 4 字节?

    其中一张表需要全部 load 到内存之中进行进行计算,根据数量级进行估算之后, 2G 内存应该足够。 改完之后,确实如此, 至少这个地方不再导致 Cassandra 集群奔溃了~

    所以个人感觉那个得罪人的帖子,还是有一些道理的~ 如果只是写业务代码,在遇到一些性能瓶颈的时候,了解一些底层的知识感觉还是会比较有帮助~

    最后打一个广告:

    南京趋势科技 个人消费者部门 招聘 3 个想玩大数据的实习生~ 最好是南京本地的,外地的每个月出勤够一定天数之后是有住宿补贴的~

    只要基础好,最好有 java/python 的基础,如果已经玩过 spark/hadoop 就最好不过啦!

    联系方式: 135 1511 7373 AT 163dotCom

    放假我就不看公司邮箱啦 呵呵

    23 条回复    2015-10-18 10:13:57 +08:00
    msg7086
        1
    msg7086  
       2015-10-16 21:33:27 +08:00   ❤️ 1
    C 在 32 位环境下 long 和 int 是一样长的。
    Cassandra 下的 BigInt 是 64 位长度。
    我觉得这是比较基础的知识吧。
    数据类型应该根据实际需求来定,哪有因为内存小了就把类型改改小跑的。
    tracyone
        2
    tracyone  
       2015-10-16 21:36:01 +08:00   ❤️ 3
    一晚下班回家,一民警迎面巡逻而来。
    突然对我大喊:“站住!”
    民警:“ int 类型占几个字节?”我:“ 4 个。”
    民警:“你可以走了。 ”
    我感到很诧异:“为什么问这样的问题?”
    民警:“深夜还在街上走,幸苦又寒酸的样子,不是小偷就是程序员!”
    我:“……”
    dqh3000
        3
    dqh3000  
       2015-10-16 21:40:32 +08:00   ❤️ 1
    标准:

    int 建议和机器字长相同
    long >= int

    (如果我没记错的话……
    dqh3000
        4
    dqh3000  
       2015-10-16 21:41:18 +08:00
    @tracyone 所以这个段子里面问 int 几个字节,是不好的,因为没有平台限定

    不过可以问 double 和 float 多少字节,因为是 IEEE 规定的~~~
    m8syYID5eaas8hF7
        5
    m8syYID5eaas8hF7  
       2015-10-16 21:50:19 +08:00
    相对较少吧~只是拿一条知识就否定一个人的能力是不是有点太偏激了~
    dqh3000
        6
    dqh3000  
       2015-10-16 21:51:02 +08:00
    Plain ints have the natural size suggested by the architecture of the execution environment
    ISO IEC 14882 2003 (C++03) p53
    XianZaiZhuCe
        7
    XianZaiZhuCe  
       2015-10-16 22:05:25 +08:00 via Android
    你看你也是碰到问题才想起这个事,说明你不太合格。我要报告你上级开除你
    juxingzhutou
        8
    juxingzhutou  
       2015-10-16 22:50:04 +08:00   ❤️ 1
    这种例子非常多,今天刚碰到一个,阿里悟空的 iOS SDK 中的某个方法参数类型是无符号整型,结果我传了补码表示的最大无符号整型(全 1 二进制串)之后报了个参数不能为 Negative 的错误。

    很多人说某些知识没用,原因也许是他们不会用,那对他们来说这些知识自然就是“没用的”。
    raincious
        9
    raincious  
       2015-10-16 22:58:26 +08:00
    而且还有比如拿 int 存时间戳然后到了 2038 年就各种问题之类的。

    其实我也挺同意原帖的某些观点。毕竟基础知识,至少得有个印象。
    raincious
        10
    raincious  
       2015-10-16 23:01:50 +08:00
    @juxingzhutou

    > 很多人说某些知识没用,原因也许是他们不会用,那对他们来说这些知识自然就是“没用的”。

    比较同意这一点。

    我刚开始写程序的时候 int => uint casting 根本不知道为了安全得判断下 int 是不是处于负值的范围,于是一直直接就(uint)好了,直到某一天出了个异常奇怪的问题才想到这样做是不是不对,于是 Google 了下一身冷汗就来了。

    所以有的时候“无知者无畏”(贬义)真的会发生。
    RangerWolf
        11
    RangerWolf  
    OP
       2015-10-17 06:05:29 +08:00
    @msg7086 不得已而为之~ 虽然只有鸟枪,但是也要上啊~ 哈哈 这就是我自己当时的想法,只有把这个东西做好了才有可能鸟枪换炮
    RangerWolf
        12
    RangerWolf  
    OP
       2015-10-17 06:08:42 +08:00
    @dqh3000 java 里面 ini 的长度不是定好的么? 求科普

    @LINEX 是的,我也感觉要多问一些问题全面掌握一个人的水平,高考还能错,面试不记得某些知识点应该可以理解~
    @XianZaiZhuCe 求放过。。。。
    @juxingzhutou 说的太好了!!!
    paledream
        13
    paledream  
       2015-10-17 08:46:34 +08:00 via Android
    情报学研一,想玩大数据,不过这学期是实习不了,不知道以后有没有机会。
    CRVV
        14
    CRVV  
       2015-10-17 10:48:18 +08:00   ❤️ 1
    @RangerWolf
    这个问题, int 占多少字节,必须指定语言才有答案
    C 和 C++是 至少 2 字节,指定编译器和指令集才有具体答案
    Java 是 4 字节
    Go 是 4 或者 8 字节
    Python 我不知道最少占多少,最多应该是没有上限

    如果单纯地问“ int 占几个字节”,还希望回答的人说 4 ,那我觉得这面试官应该下岗了

    如果是 C/C++程序员,知道 C 语言的数据类型占几个字节是必须的
    如果是 Python 程序员,管这玩意干啥
    当在 C/C++里声明一个 int 类型的变量,意思就是随意来一个 16 或者 32 或者 64 位的有符号整数,需要指定长度的何不用 int32_t 这些类型
    sorra
        15
    sorra  
       2015-10-17 15:23:28 +08:00   ❤️ 1
    有符号数的第一个位是符号位,无符号数没有符号位。 Java 没有无符号数。
    16 位只有 65536 个值,极易溢出。 32 位是-21 亿~21 亿,也可能溢出。 64 位很大很大,事物的数量很难超越它。
    浮点数(double, float)做十进制运算有不可避免的误差,不能用于精确计算。

    所以数据库里主键一般用 64 位或以上的整数。内存中如果能压缩掉多余的位,就节省了内存,这个帖子就是好例子。

    还有一项重要知识是常见硬件的性能范围, CPU 、内存、磁盘、 SSD 、网卡,等等。多知道一些无疑是有好处的。
    znoodl
        16
    znoodl  
       2015-10-17 16:44:33 +08:00 via iPhone
    我一般在不需要负数的时候都用 size_t ,前几天因为用 long 读一个大文件溢出了
    RangerWolf
        17
    RangerWolf  
    OP
       2015-10-17 19:47:07 +08:00
    @sorra 是的, 很同意你的观点~ 当然除了 java ,其他语言的知识我知道的就很少了。。。
    RangerWolf
        18
    RangerWolf  
    OP
       2015-10-17 19:48:30 +08:00
    @paledream 情报学! 看起来以后要进国安局的节奏? 以前还见过一个 图书馆情报学。。。 不知道是什么,看起来很厉害的样子~
    不知道为什么现在不能出来实习呢?
    paledream
        19
    paledream  
       2015-10-17 21:34:32 +08:00
    @RangerWolf 我就是图书情报的,其实就是信息管理的上级学科,搞数据挖掘之类的,研一有专业课所以不好出去
    RangerWolf
        20
    RangerWolf  
    OP
       2015-10-18 07:28:15 +08:00
    @paledream 看来专业比较对口,一周来四天就好了,有兴趣啊?
    paledream
        21
    paledream  
       2015-10-18 08:58:13 +08:00 via Android
    @RangerWolf 要是研二还有机会的话就去,现在确实去不了
    RangerWolf
        22
    RangerWolf  
    OP
       2015-10-18 09:36:15 +08:00
    @paledream ok 了解了~ 不知道有推荐的师兄师姐吗?
    paledream
        23
    paledream  
       2015-10-18 10:13:57 +08:00
    @RangerWolf 师兄师姐的情况不是很熟悉,不过都有自己的事情在忙。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 02:41 · PVG 10:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.