面试题汇总

本文探讨了导致Go服务超时的八大常见原因,包括业务逻辑性能瓶颈、异常流量冲击、系统调用延迟、网络故障、CPU资源限制、中间件故障、Go调度问题及垃圾回收异常。并介绍了通过pprof、GODEBUG、fgprof和gotrace等工具辅助定位问题的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存只有 2G,如何对 100 亿数据进行排序?

大数据小内存排序问题,很经典,很常见,类似的还有比如 “如何对上百万考试的成绩进行排序” 等等

大概有这么三种方法:

数据库排序(对数据库设备要求较高)
分治法(常见思路)
位图法(Bitmap)

  1. 数据库排序
    将存储着 100 亿数据的文本文件一条一条导入到数据库中,然后根据某个字段建立索引,数据库进行索引排序操作后我们就可以依次提取出数据追加到结果集中。

这种方法的特点就是操作简单, 运算速度较慢,对数据库设备要求较高

  1. 分治法
    假设 100 亿个数据都是 int 类型的数字

1 个 int 类型占 4 个字节(byte,B)

1 B = 8 位(bit)

1024 B(1024 B = 1KB) = 8 * 1024 bit

1024 * 1024 KB(1024KB = 1MB)= 1024 * 8 * 1024 bit

100 亿 int 型数字就是 100 亿 x 4B = 400 亿 B = 38146.97265625 MB 约等于 37.25GB

100 亿个 int 型数字大概占 37 个 G,2G 内存显然一次性是装不下的。

最常见的思路,拆分成一个一个的小文件来处理呗,最终再合并成一个排好序的大文件。

典型的分治法

1)把这个 37 GB 的大文件,用哈希或者直接平均分成若个小文件(比如 1000 个,每个小文件平均 38 MB 左右)

2)拆分完了之后,得到 1000 个 30 多 MB 的小文件,那么就可以放进内存里排序了,可以用快速排序,归并排序,堆排序等等

3)1000 个小文件内部排好序之后,就要把这些内部有序的小文件,合并成一个大的文件,可以用堆排序来做 1000 路合并的操作(假设是从小到大排序,用小顶堆):

首先遍历 1000 个文件,每个文件里面取第一个数字,组成 (数字, 文件号) 这样的组合加入到堆里,遍历完后堆里有 1000 个 (数字,文件号) 这样的元素
然后不断从堆顶 pop 元素追加到结果集,每 pop 一个元素,就根据它的文件号去对应的文件里,补虫一个元素进入堆中,直到那个文件中的元素被拿完
按照上面的操作,直到堆被取空了,此时最终结果文件里的全部数字就是有序的了

https://cloud.tencent.com/developer/article/1978035

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值