100G的文件如何读取续集 - 第307篇

文章介绍了处理大文件的一种策略,通过将大文件分割成多个小文件,然后使用多线程进行读取,以提高效率。具体方法包括使用Linux的split命令按指定大小分割文件,以及在Java中创建线程池读取每个小文件。这种方法在处理大量数据时能显著减少读取时间。
摘要由CSDN通过智能技术生成

文章目录

一、大文件读取之文件分割法

二、大文件读取之多线程读取

三、悟纤小结

一、大文件读取之文件分割法

      

我们来看下这种方法的核心思路就是:不是文件太大了嘛?那么是否可以把文件拆分成几个小的文件,然后使用多线程进行读取呐?具体的步骤:

(1)先分割成多个文件。

(2)多个线程操作多个文件,避免两个线程操作同一个文件

(3)按行读文件

1.1 文件分割

       在Mac和Linux都有文件分割的命令,可以使用:

split  -b 1024m  test2.txt   /data/tmp/my/test.txt.

说明:

(1)split:分割命令;

(2)-b 1024m:指定每多少字就要切成一个小文件。支持单位:m,k;这里是将6.5G的文件按照1G进行拆分成7个文件左右。

(3)test2.txt:要分割的文件;

(4)test.txt. : 切割后文件的前置文件名,split会自动在前置文件名后再加上编号;

其它参数:

(1)-l<行数> : 指定每多少行就要切成一个小文件。

(2) -C<字节>:与-b参数类似,但切割时尽量维持每行的完整性。

分割成功之后文件是这样子的:













 

1.2 多线程读取分割文件

       我们使用多线程读取分割的文件,然后开启线程对每个文件进行处理:

 
  1. public void readFileBySplitFile(String pathname) {

  2. //pathname这里是路径,非具体的文件名,比如:/data/tmp/my

  3. File file = new File(pathname);

  4. File[] files = file.listFiles();

  5. List<MyThread> threads = new ArrayList<>();

  6. for(File f:files) {

  7. MyThread thread = new MyThread(f.getPath());

  8. threads.add(thread);

  9. thread.start();

  10. }

  11. for(MyThread t:threads) {

  12. try {

  13. t.join();

  14. } catch (InterruptedException e) {

  15. e.printStackTrace();

  16. }

  17. }

  18. }

  19. private class MyThread extends Thread{

  20. private String pathname;

  21. public MyThread(String pathname) {

  22. this.pathname = pathname;

  23. }

  24. @Override

  25. public void run() {

  26. readFileFileChannel(pathname);

  27. }

  28. }

说明:

(1)获取到指定目录下的所有分割的文件信息;

(2)遍历文件路径,将路径使用线程进行处理,这里线程的run使用readFileChannel进行读取每个文件的信息。

(3)join方法:就是让所有线程等待,然后回到主线程,不懂的可以参之前的一篇文章:《悟纤和师傅去女儿国「线程并行变为串行,Thread你好牛」

测试:6.5G 耗时:4秒

       这个多线程的方式,那么理论上是文件越大,优势会越明显。对于线程开启的个数,这里使用的是文件的个数,在实际中,能这么使用嘛?答案肯定是不行的。相信大家应该知道怎么进行改良下,这里不展开讲解。

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:100G的文件如何读取续集 - 第307篇

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值