目前是利用 redis set 实现判断,但这么大的数据量与 redis 交互还是有点慢。
要求精准,不误判,不漏判
使用场景如下:
用户上传excel文件,需要解析文件并且禁止某一列的值存在相同的。还要查找出哪一行是重复的。
因为解析excel是个更加消耗资源的过程,且为了减少内存占用使用流式解析,即每次只能读取到一行记录。
并且文件可能很大,用java的set可能导致oom,现采用redis set,在内存中累计1000条,批量插入redis set中。 这是我能想到一定内存下的最好方式了。
布隆过滤器应该是不满足条件的,这里需要精准判断是否重复,不误判,漏判。
![]() | 1 ClarkAbe 2021-07-31 18:14:34 +08:00 AC 自动机试试?不过感觉会更.... |
![]() | 2 lerry 2021-07-31 18:27:14 +08:00 如果字符串比较长,可以先 hash 一下 |
![]() | 3 bagheer 2021-07-31 21:24:13 +08:00 按行存为 txt, 然后 sort -u |
![]() | 4 Mohanson 2021-08-01 00:00:36 +08:00 前缀树 |
![]() | 5 wellsc 2021-08-01 00:01:45 +08:00 via iPhone 又到了布隆过滤器时刻了 |
![]() | 6 wombat 2021-08-01 00:25:39 +08:00 via iPhone 布隆,或者布谷鸟? |
![]() | 7 Samuelcc 2021-08-01 14:41:17 +08:00 via Android 可以描述一下使用场景。 例如是已经有一个词库,不断有新的输入和词库查重,还是就是固定的百万字符串里找重复的? 如果是前者,这个词库会有变化吗? |
![]() | 8 sadfQED2 2021-08-02 10:04:51 +08:00 via Android 要求精确的话布隆过滤器就别瞎掺和了吧。 建议 1.redis set,redis 根本不是你的瓶颈,读文件才是瓶颈 2.楼上的前缀树也可以,但是实现比 redis set 方案复杂太多了 |
![]() | 9 sadfQED2 2021-08-02 10:06:52 +08:00 via Android 另外提醒一下,excel 我记得最多就 5 万多行吧,jvm 堆内存搞大点,set 也不会 oom 吧 |