heguangyu5 最近的时间轴更新
heguangyu5

heguangyu5

🏢  云招科技 / PHP
V2EX 第 159374 号会员,加入于 2016-02-18 14:10:24 +08:00
今日活跃度排名 8423
heguangyu5 最近回复了
@wxf666 这两个解决方案都是基于 hashtable 去重的,就是那个普通意义的 hashtable,没有什么花招,所以你的猜想都对.

hash 冲突了,就是要回源文件比较原始行,随机读有可能会很多.

但是如果能提前知晓数据的大致分布情况,可能会有更恰当的解决办法.

在不知道的情况下,这两个方案可以快速试错,然后找到正确的方向.
@Keuin 原 OP 也说了要尝试一下你的加行号方案,期待结果
@wxf666

2. 可以指定限制多少内存完成吗?

需要的内存是和要处理的数据量成正比的,如果内存不够,那就无法完成.

当然要在内存不够的情况下完成,那就是另一个解法了,耗时可能会很长,我一开始尝试了一个方案,因为无法较准确的预估处理完所需要的时间,所以就放弃了.

现在的这两个方案处理时间是可靠的,可等的,dedup-use-less-mem 可在约 10 小时左右的时间处理完 203 亿,一个晚上就能得出结论.
@Keuin 请仔细看下原贴,原 OP 已经说了 "尝试过的方案有 sort | uniq 会卡死不出结果"
@wxf666

1. 楼主硬盘读写速度多少?

4 块 4TB 西数机械硬盘做 RAID 0,读写速度可能在 200~400M/s?不太确定.
gen-20.3B-lines.sh 生成 6.8TB 数据用了 7 个多小时.

2. 可以指定限制多少内存完成吗?

dedup-use-more-mem 每 1 亿行数据需要 1.34GB 内存,N 亿就是 N*1.34,当然还需要留出几个 G 的内存给操作系统正常运行.
dedup-use-less-mem 每 1 亿行数据需要 0.67GB 内存.203 亿 136GB 就够了,所以完成 6.2TB-203 亿去重 150G 内存足够了.


3. 有不同的两行,恰好 hash 相同,会出问题吗?

hashtable 就是普通意义的那个,比例 php 的 array,其它语言里的 map, dict 什么的,hash 当然会冲突,这时要解决冲突,常见的解决冲突办法是单链表.所以结果是精确的,不会有误判率什么的.


4. 除顺序读一次原文件外,还需要额外读写多少文件吗?

dedup-use-more-mem 始终都在读原文件.

dedup-use-less-mem 需要额外借助其它文件的帮助.


5. 能轻而易举改造成,针对 CSV 文件(可能有字符串跨多行),且现有成绩影响不大,是吗?

可以的.现在是按\n 取一行的,可以换成其它逻辑.
@ShuWei 是的,简单的 hashtable 就能解决,前提是仔细思考问题本身和操控计算资源.
@picone

1. 思路就是基于 hash 去重的.
2/3. 可执行程序在那里,你可以自己 down 回来试一下.我给的内存用量和处理时间(20 亿以内)是实测数据,不是拍脑袋粗估的.
155 天前
回复了 heguangyu5 创建的主题 PHP PHP 编译器 BPC 7.1 发布,成功编译 webman-admin
@Sligcm

当然是改成动态下载编译好的.so,然后调用 `dl()` 加载进来.不过需要进一步完善一下当前的 dl()实现.
这个方法只能安装插件,不能卸载.
176 天前
回复了 heguangyu5 创建的主题 PHP PHP 编译器 BPC 7.1 发布,成功编译 webman-admin
@aogg laravel 东西太多了,我在编译 Illuminate/Database 的过程中领教了一下,我自己就不搞了,有需要的人自己编译吧.
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4834 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 20ms · UTC 01:20 · PVG 09:20 · LAX 18:20 · JFK 21:20
Developed with CodeLauncher
♥ Do have faith in what you're doing.