准备1千万个随机数字,保存到文件并顺序读取
来源:互联网 发布:ecshop大京东2.5源码 编辑:程序博客网 时间:2024/05/01 20:50
今天花了些时间,想准备1千万条数据用于测试不同算法的排序性能。 刚开始的思路是:使用Apache的IOUtils操作文件,Apache的Common-lang中的StringUtils.join(int[], ",")将int[] 转换为string保存到文件。 读出数据,通过String.split(","),再转换为int[]。 想想就觉得别扭,转来转去的,特别是数据量大了,1千万条,极其耗CPU,速度不理想。 调优前: 1百万:保存需要260ms多,读取需要1s多。 1千万:保存需要6s多,读取需要14s多。 调优后: 1百万:保存需要50ms,读取需要50ms。 1千万:保存需要400ms多,读取需要4.2s多。 (读取慢,主要原因是初始堆内存太小-100m,几次垃圾回收就用掉了3s多) 调整jvm参数:-Xms4096m -Xmx4096m -Xmn2048m 1百万:保存需要50ms,读取需要50ms。 1千万:保存需要400ms多,读取需要200ms多。 3千万:保存需要1.5s多,读取需要530ms多。 5千万:保存需要2.6s多,读取需要870ms多。 1亿:保存需要5.3s多,读取时间长,不可接受。(上亿条之后,需要20*1亿,2G多的内存,超过虚拟机设置的新生代内存大小,所以爆慢,可以理解。不知道为什么不报OutOfMemory异常)。 1千万条数据内存占用分析。 数组需要连续的一大块内存,分配1千万条Integer(20),需要2亿byte,及200m连续内存。 在繁忙的系统中,这个是很困难的,可能造成系统瓶颈,甚至崩溃。 一个Integer对象,需要20字节保存,虽然一个int只占4字节 int[] datas占用200m,ByteBuffer.allocate(4*1千万)占40m。 Integer[]data占40m,一个引用4字节,存放了1千万个Integer引用。 所以,系统会使用300m左右的内存。再加上其他的开销,400m左右吧。
代码:
public static void saveHuge(String path, int len) { File file = new File(path); if (file.exists()) { file.delete(); } long start = System.currentTimeMillis(); try (FileOutputStream fos = new FileOutputStream(path); FileChannel fc = fos.getChannel();) { ByteBuffer buff = ByteBuffer.allocate(4*len); Random r = new Random(); for (int i=0; i<len; i++) { buff.putInt(r.nextInt(MAX)); } buff.flip(); fc.write(buff); } catch (IOException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("save() time used : " + (end - start) + " ms");}public static Integer[] readHuge(String path, int len) { long start = System.currentTimeMillis(); Integer datas[] = new Integer[len]; try (FileInputStream fis = new FileInputStream(path);FileChannel fc = fis.getChannel();) { ByteBuffer buff = ByteBuffer.allocate(4*len); fc.read(buff); buff.flip(); int i=0; while (buff.remaining() > 0 && len-- > 0) { datas[i] = buff.getInt(); i++; } buff.clear(); } catch (IOException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("save() time used : " + (end - start) + " ms"); return datas;}
0 0
- 准备1千万个随机数字,保存到文件并顺序读取
- [C/C++]随机生成信息,并保存到文件中
- java生成随机uuid并保存到文件
- 读取文件随机返回一个并打印到控制台
- 1.请从键盘随机输入10个整数保存到List中,并按倒序、从大到小的顺序显示出来
- 请从键盘随机输入5个整数保存到List中,并按倒序、从大到小的顺序显示出来
- Python读取多个txt文件并进行保存
- 从剪贴板读取并保存图片到文件
- 从剪贴板读取并保存图片到文件
- 读取文件内容并保存到string中
- ffmpeg读取rtsp并保存到mp4文件
- java实现xml文件读取并保存到对象
- qt 读取txt文件内容并保存到数组中
- 使用python读取.txt文件并保存到Excel中
- 利用FileReader.readAsText()读取文件内容并保存到服务器
- Java中读取一个TXT文件中的每行内容的前5个字符,并保存到另一个TXT文件中。
- java读取Excel数据,然后写入到txt文件,并批量保存到oracle数据库中
- js随机产生40个60至100之间的不相同的数字存入数组并顺序排序
- Pots(bfs恶心的宽搜)
- HDU 4803 Poor Warehouse Keeper(贪心)
- Create blog posts from RStudio to WordPress
- ifconfig配置网络时,出现“SIOCSIFADDR: No such device”和“eth0:ERROR while getting interface flags:No such dev”
- ajax原理和XmlHttpRequest对象
- 准备1千万个随机数字,保存到文件并顺序读取
- 数组溢出与指针问题
- 从两段代码中理解JavaScript的单线程和异步
- Java中数字格式化问题
- Android Studio 报:AndroidManifest.xml (系统找不到指定的路径。) 错误
- hdu1019(快排&&欧几里得)
- 第30讲-求两个整数的最大公约数(辗转相除法)
- Android学习笔记day10
- uva10714 - Ants