Java 多线程精准定位毫秒级分片读取大文件实战

一、引言

在处理大文件读取任务时,传统的单线程读取方式往往效率低下,无法满足性能要求。本文将深入探讨一种基于Java多线程的分片读取文件方案,并结合实际代码进行详细剖析与性能分析。

二、技术背景

当文件体积庞大时,一次性读取整个文件会消耗大量内存且耗时较长。采用多线程分片读取策略,能够充分利用多核处理器的优势,将文件划分为多个片段,每个线程负责读取一个片段,最后合并结果,从而显著提升读取效率。

三、代码实现解析

import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;

public class FileUtils {

    public static void main(String[] args) {

        Instant startTime = Instant.now();

        ExecutorService executorService = Executors.newFixedThreadPool(17);
        try {
            FragmentedReadFileLineResult fragmentedReadFileLineResult = fragmentedReadFile(executorService, "1.txt", 0, 2 * 1024 * 1024);

            // 打印耗时
            Instant endTimeReadAndParse = Instant.now();
            long durationReadAndParse = Duration.between(startTime, endTimeReadAndParse).toMillis();
            File file = new File("1.txt");
            System.out.println("文件大小:" + file.length() / (1024 * 1024 * 1024) + "GB,读取文件总耗时:" + durationReadAndParse + "毫秒,总行数:" + fragmentedReadFileLineResult.getRow());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            executorService.shutdown();
        }

    }

    /**
     * 分片读取文件内容,多线程并发读取,最后合并读取的内容
     *
     * @param asyncExecutor

你可能感兴趣的:(Java爬坑之路,java,开发语言)