(有意思的项目)--快速统计大文件(10 亿行)中的数据需要的技术是

查看 73|回复 2
作者:lsk569937453   
刚才在 github 上看到一个有意思的项目 https://github.com/gunnarmorling/1brc 。项目是开放式的,任何人都可以提交,主要是统计 10 亿行数据。
目前排名第一的提交是
```
https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_royvanrijn.java
```
该算法的注释如下:
```
* Initial submission: 62000 ms
* Chunked reader: 16000 ms
* Optimized parser: 13000 ms
* Branchless methods: 11000 ms
* Adding memory mapped files: 6500 ms (based on bjhara's submission)
* Skipping string creation: 4700 ms
* Custom hashmap... 4200 ms
* Added SWAR token checks: 3900 ms
* Skipped String creation: 3500 ms (idea from kgonia)
* Improved String skip: 3250 ms
* Segmenting files: 3150 ms (based on spullara's code)
* Not using SWAR for EOL: 2850 ms
* Inlining hash calculation: 2450 ms
* Replacing branchless code: 2200 ms (sometimes we need to kill the things we love)
* Added unsafe memory access: 1900 ms (keeping the long[] small and local)
```
感觉还挺有意思的,我其实想知道
1.memory mapped files 会不会把内存干爆阿。
2.unsafe memory access 为什么这么快,会造成内存泄露?
3.把内存限制一下会不会更有挑战点。

string, files, memory, swar

billccn   
memory mapped files 就是为了不把文件在内存里复制一份,绝不可能把内存干爆( 32 位机除外)。
我没看源码,但是 unsafe memory access 可能是配合以上 memory mapped files 使用。Java 里正常的 NIO API 是需要使用 Buffer 类型,这个类型需要 flip 来 flip 去,开销大,同一个 Buffer 读不同的数据类型还需要各种奇技淫巧,unsafe memory access 就相当于直接按内存地址访问,你说那个地址是什么类型就是什么类型,对于 primitive 类型是安全的。
dhb233   
mmap 一个文件的话,是要有足够的内存的,但是 10 亿行数据大约 12G ,服务器内存还是足够的。如果内存不够的话,也可以分段多次 mmap 。
没仔细看要求,这么大的文件,主要开销都在加载文件了吧,好像也没说多少核 CPU 并发,以及 CPU 内存型号要求?
java 不太熟,就当瞎说吧。。。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部