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

2015-10-16 21:04:28 +08:00
 RangerWolf
不撕逼,只描述一个自己遇到的事情而已。 大概描述一下吧~

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

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

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

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

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


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

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

联系方式: 135 1511 7373 AT 163dotCom

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

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

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

不过可以问 double 和 float 多少字节,因为是 IEEE 规定的~~~
m8syYID5eaas8hF7
2015-10-16 21:50:19 +08:00
相对较少吧~只是拿一条知识就否定一个人的能力是不是有点太偏激了~
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
2015-10-16 22:05:25 +08:00
你看你也是碰到问题才想起这个事,说明你不太合格。我要报告你上级开除你
juxingzhutou
2015-10-16 22:50:04 +08:00
这种例子非常多,今天刚碰到一个,阿里悟空的 iOS SDK 中的某个方法参数类型是无符号整型,结果我传了补码表示的最大无符号整型(全 1 二进制串)之后报了个参数不能为 Negative 的错误。

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

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

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

比较同意这一点。

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

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

@LINEX 是的,我也感觉要多问一些问题全面掌握一个人的水平,高考还能错,面试不记得某些知识点应该可以理解~
@XianZaiZhuCe 求放过。。。。
@juxingzhutou 说的太好了!!!
paledream
2015-10-17 08:46:34 +08:00
情报学研一,想玩大数据,不过这学期是实习不了,不知道以后有没有机会。
CRVV
2015-10-17 10:48:18 +08:00
@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
2015-10-17 15:23:28 +08:00
有符号数的第一个位是符号位,无符号数没有符号位。 Java 没有无符号数。
16 位只有 65536 个值,极易溢出。 32 位是-21 亿~21 亿,也可能溢出。 64 位很大很大,事物的数量很难超越它。
浮点数(double, float)做十进制运算有不可避免的误差,不能用于精确计算。

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

还有一项重要知识是常见硬件的性能范围, CPU 、内存、磁盘、 SSD 、网卡,等等。多知道一些无疑是有好处的。
znoodl
2015-10-17 16:44:33 +08:00
我一般在不需要负数的时候都用 size_t ,前几天因为用 long 读一个大文件溢出了
RangerWolf
2015-10-17 19:47:07 +08:00
@sorra 是的, 很同意你的观点~ 当然除了 java ,其他语言的知识我知道的就很少了。。。
RangerWolf
2015-10-17 19:48:30 +08:00
@paledream 情报学! 看起来以后要进国安局的节奏? 以前还见过一个 图书馆情报学。。。 不知道是什么,看起来很厉害的样子~
不知道为什么现在不能出来实习呢?
paledream
2015-10-17 21:34:32 +08:00
@RangerWolf 我就是图书情报的,其实就是信息管理的上级学科,搞数据挖掘之类的,研一有专业课所以不好出去
RangerWolf
2015-10-18 07:28:15 +08:00
@paledream 看来专业比较对口,一周来四天就好了,有兴趣啊?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228641

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX