最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)大文件導(dǎo)出的實(shí)現(xiàn)與優(yōu)化

 更新時間:2023年11月23日 10:08:24   作者:淡抹心痕  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)大文件導(dǎo)出的實(shí)現(xiàn)與優(yōu)化的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們深入了解java有一定的幫助,感興趣的小伙伴可以了解下

關(guān)于大文件導(dǎo)出的優(yōu)化迭代情況如下:

計(jì)算機(jī)配置:四核16G內(nèi)存

初始版本為單線程單文件導(dǎo)出文件,mybatis讀 opencsv寫,耗時將近三小時;

第一輪優(yōu)化改為多線程單文件,提高讀數(shù)據(jù)效率,時間僅縮減十分鐘;

第二輪改為多線程多文件,提高寫文件效率,時間縮減一個半小時;

第三輪使用 Mybatis 流式查詢,并改用 Map 封裝數(shù)據(jù),提高內(nèi)存利用率,時間縮減十分鐘;

第四輪棄用 Mybatis ,改用原生 JDBC 獲取數(shù)據(jù)并直接拼接,時間縮減十分鐘;

第五輪棄用 opencsv ,改用 BufferWriter 直接寫數(shù)據(jù),時間縮減十分鐘;

輸出:

2023-04-23 22:01:30 [main] INFO  WriteData - 單線程單文件 total time in 258s
2023-04-23 22:02:44 [main] INFO  WriteData - 固定線程單文件 total time in 74s
2023-04-23 22:03:40 [main] INFO  WriteData - 固定線程多文件 total time in 55s
2023-04-23 22:04:18 [main] INFO  WriteData - concurrentWrite total time in 37s

2023-04-23 22:26:28 [Thread-1] INFO  WriteData - query in 42s
2023-04-23 22:26:28 [Thread-3] INFO  WriteData - query in 42s
2023-04-23 22:26:28 [Thread-4] INFO  WriteData - query in 42s
2023-04-23 22:26:28 [Thread-6] INFO  WriteData - query in 42s
2023-04-23 22:26:28 [Thread-7] INFO  WriteData - query in 42s
2023-04-23 22:26:28 [Thread-2] INFO  WriteData - query in 42s
2023-04-23 22:26:28 [Thread-5] INFO  WriteData - query in 42s
2023-04-23 22:26:30 [Thread-0] INFO  WriteData - query in 44s

2023-04-23 22:27:00 [Thread-5] INFO  WriteData - write in 31s
2023-04-23 22:27:00 [Thread-1] INFO  WriteData - write in 31s
2023-04-23 22:27:00 [Thread-7] INFO  WriteData - write in 31s
2023-04-23 22:27:00 [Thread-2] INFO  WriteData - write in 31s
2023-04-23 22:27:00 [Thread-3] INFO  WriteData - write in 32s
2023-04-23 22:27:00 [Thread-6] INFO  WriteData - write in 32s
2023-04-23 22:27:00 [Thread-4] INFO  WriteData - write in 32s
2023-04-23 22:27:01 [Thread-0] INFO  WriteData - write in 31s

2023-04-23 22:27:01 [main] INFO  WriteData - 固定線程單文件 total time in 75s

2023-04-23 22:27:24 [Thread-14] INFO  WriteData - query in 22s
2023-04-23 22:27:24 [Thread-13] INFO  WriteData - query in 22s
2023-04-23 22:27:24 [Thread-12] INFO  WriteData - query in 22s
2023-04-23 22:27:24 [Thread-9] INFO  WriteData - query in 22s
2023-04-23 22:27:24 [Thread-11] INFO  WriteData - query in 22s
2023-04-23 22:27:24 [Thread-10] INFO  WriteData - query in 22s
2023-04-23 22:27:24 [Thread-15] INFO  WriteData - query in 22s
2023-04-23 22:27:25 [Thread-8] INFO  WriteData - query in 23s

2023-04-23 22:27:55 [Thread-12] INFO  WriteData - write in 31s
2023-04-23 22:27:55 [Thread-14] INFO  WriteData - write in 31s
2023-04-23 22:27:55 [Thread-9] INFO  WriteData - write in 31s
2023-04-23 22:27:55 [Thread-11] INFO  WriteData - write in 31s
2023-04-23 22:27:55 [Thread-13] INFO  WriteData - write in 31s
2023-04-23 22:27:56 [Thread-15] INFO  WriteData - write in 31s
2023-04-23 22:27:56 [Thread-10] INFO  WriteData - write in 31s
2023-04-23 22:27:56 [Thread-8] INFO  WriteData - write in 31s

2023-04-23 22:27:56 [main] INFO  WriteData - 固定線程多文件 total time in 54s

示例代碼

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.*;
import java.time.Duration;
import java.time.LocalDate;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class WriteData {

    static final Logger log = LoggerFactory.getLogger(WriteData.class);
    public static final String PARENT_PATH = "C:\\Users\\qiu01\\Desktop\\server\\docker\\mysql\\master\\data\\stu_data\\";
    public static final String URL = "jdbc:mysql://localhost:3307/stu?allowPublicKeyRetrieval=TRUE&useCursorFetch=true";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "123456";
    public static final String SQL = "SELECT * FROM student WHERE id > ? AND id <= ?";
    public static final int TOTAL = 10000000;

    public static final ThreadPoolExecutor POOL = new ThreadPoolExecutor(8, 9, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
    public static final HikariDataSource DS;

    static {
        HikariConfig config = new HikariConfig();

        config.setJdbcUrl(URL);
        config.setUsername(USERNAME);
        config.setPassword(PASSWORD);

        DS = new HikariDataSource(config);
    }


    public static void main(String[] args) {
    	// 單線程寫文件
        singleThreadWrite();
        // 固定線程寫同
        concurrentWriteWithFixedThread(true);
        concurrentWriteWithFixedThread(false);
        concurrentWrite();
    }

    public static void singleThreadWrite() {
        String file = PARENT_PATH + "file.csv";
        long start = System.currentTimeMillis();
        try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(Paths.get(file))));
             Connection connection = DS.getConnection();
             PreparedStatement stmt = connection.prepareStatement(SQL,ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);) {

            stmt.setFetchSize(10000);
            stmt.setFetchDirection(ResultSet.FETCH_REVERSE);
            stmt.setInt(1, 0);
            stmt.setInt(2, 10000000);

            ResultSet rs = stmt.executeQuery();
            writeToFile(writer, rs);
        } catch (SQLException | IOException e) {
            throw new RuntimeException(e);
        }
        log.info("單線程單文件 total time in {}s", getSeconds(start));
        emptyFolder();
    }


    private static void concurrentWriteWithFixedThread(boolean writeInOneFile) {
        int batch_size = 1250000;
        Thread[] threads = new Thread[TOTAL/batch_size];
        long start = System.currentTimeMillis();
        for (int i = 0; i < TOTAL; i = i + batch_size) {
            final int j = i;
            int no = i / batch_size;

            Thread t = new Thread(() -> {
                String file;
                if (writeInOneFile) {
                    file = PARENT_PATH + "file.csv";
                } else {
                    file = PARENT_PATH + "file_" + no + ".csv";
                }

                try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
                     Connection connection = DS.getConnection();
                     PreparedStatement stmt = connection.prepareStatement(SQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
                ) {
                    stmt.setFetchSize(10000);
                    stmt.setFetchDirection(ResultSet.FETCH_REVERSE);
                    stmt.setInt(1, j);
                    stmt.setInt(2, j + batch_size);
                    long queryStart = System.currentTimeMillis();
                    try (ResultSet rs = stmt.executeQuery()) {
                        log.info("query in {}s", getSeconds(queryStart));
                        long writeStart = System.currentTimeMillis();
                        writeToFile(writer, rs);
                        log.info("write in {}s", getSeconds(writeStart));
                    }
                } catch (SQLException | IOException e) {
                    throw new RuntimeException(e);
                }
            });
            t.start();
            threads[no] = t;
        }
        for (Thread t : threads) {
            try {
                t.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        if (writeInOneFile) {
            log.info("固定線程單文件 total time in {}s", getSeconds(start));
        } else {
            log.info("固定線程多文件 total time in {}s", getSeconds(start));
        }
//        emptyFolder();
    }

    private static void concurrentWrite() {
        int batch_size = 10000;
        CompletableFuture<Void>[] futures = new CompletableFuture[TOTAL/batch_size];
        long start = System.currentTimeMillis();
        for (int i = 0; i < TOTAL; i = i + batch_size) {
            final int j = i;
            int no = i / batch_size;

            CompletableFuture<Void> t = CompletableFuture.runAsync(() -> {
                String file = PARENT_PATH + "file_" + no + ".csv";

                try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(Paths.get(file))));
                     Connection connection = DS.getConnection();
                     PreparedStatement stmt = connection.prepareStatement(SQL,ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
                     ) {
                    stmt.setInt(1, j);
                    stmt.setInt(2, j + batch_size);
                    try (ResultSet rs = stmt.executeQuery()){
                        writeToFile(writer, rs);
                    }
                } catch (SQLException | IOException e) {
                    throw new RuntimeException(e);
                }
            },POOL);
            futures[no] = t;
        }
        CompletableFuture.allOf(futures).join();
        log.info("多線程多文件 total time in {}s", getSeconds(start));
        POOL.shutdown();
        emptyFolder();
    }

    private static void emptyFolder() {
        File file = new File(PARENT_PATH);
        File[] files = file.listFiles();
        for (File f : files) {
            f.delete();
        }
    }

    private static void writeToFile(BufferedWriter writer, ResultSet rs) throws SQLException, IOException {
        StringBuilder builder = new StringBuilder();
        while (rs.next()) {
            String firstName = rs.getString("first_name");
            String lastName = rs.getString("last_name");
            LocalDate dob = rs.getDate("date_of_birth").toLocalDate();
            String gender = rs.getString("gender");
            String email = rs.getString("email");
            String phone = rs.getString("phone_number");
            String address = rs.getString("address");
            String city = rs.getString("city");
            String state = rs.getString("state");
            String zip = rs.getString("zip_code");
            String country = rs.getString("country");
            String nationality = rs.getString("nationality");
            String religion = rs.getString("religion");
            String emergencyContactName = rs.getString("emergency_contact_name");
            String emergencyContactPhone = rs.getString("emergency_contact_phone_number");
            String guardianName = rs.getString("guardian_name");
            String guardianPhone = rs.getString("guardian_phone_number");
            String highSchoolName = rs.getString("high_school_name");
            double highSchoolGpa = rs.getDouble("high_school_gpa");
            int highSchoolGradYear = rs.getInt("high_school_graduation_year");
            String major = rs.getString("major");
            String degreeLevel = rs.getString("degree_level");
            String enrollmentStatus = rs.getString("enrollment_status");

            builder.append(firstName).append("|");
            builder.append(lastName).append("|");
            builder.append(dob).append("|");
            builder.append(gender).append("|");
            builder.append(email).append("|");
            builder.append(phone).append("|");
            builder.append(address).append("|");
            builder.append(city).append("|");
            builder.append(state).append("|");
            builder.append(zip).append("|");
            builder.append(country).append("|");
            builder.append(nationality).append("|");
            builder.append(religion).append("|");
            builder.append(emergencyContactName).append("|");
            builder.append(emergencyContactPhone).append("|");
            builder.append(guardianName).append("|");
            builder.append(guardianPhone).append("|");
            builder.append(highSchoolName).append("|");
            builder.append(highSchoolGpa).append("|");
            builder.append(highSchoolGradYear).append("|");
            builder.append(major).append("|");
            builder.append(degreeLevel).append("|");
            builder.append(enrollmentStatus).append("\n");

            writer.write(builder.toString());
            builder.delete(0, builder.length());
        }
    }

    private static long getSeconds(long start) {
        return Duration.ofMillis(System.currentTimeMillis() - start).getSeconds();
    }
}

以上就是java實(shí)現(xiàn)大文件導(dǎo)出的實(shí)現(xiàn)與優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于java文件導(dǎo)出的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot Autowried及Resouce使用對比解析

    Springboot Autowried及Resouce使用對比解析

    這篇文章主要介紹了Springboot Autowried及Resouce使用對比解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java后端接口中提取請求頭中的Cookie和Token的方法

    Java后端接口中提取請求頭中的Cookie和Token的方法

    在現(xiàn)代 Web 開發(fā)中,HTTP 請求頭(Header)是客戶端與服務(wù)器之間傳遞信息的重要方式之一,本文將詳細(xì)介紹如何在 Java 后端(以 Spring Boot 為例)中提取請求頭中的 Cookie 和 Token,并提供完整的代碼示例和優(yōu)化建議,需要的朋友可以參考下
    2025-01-01
  • SpringBoot整合Kafka完成生產(chǎn)消費(fèi)的方案

    SpringBoot整合Kafka完成生產(chǎn)消費(fèi)的方案

    網(wǎng)上找了很多管理kafka整合springboot的教程,但是很多都沒辦法應(yīng)用到生產(chǎn)環(huán)境,很多配置都是缺少,或者不正確的,只能當(dāng)個demo,所以本文給大家介紹了SpringBoot整合Kafka完成生產(chǎn)消費(fèi)的方案,需要的朋友可以參考下
    2024-12-12
  • synchronized及JUC顯式locks?使用原理解析

    synchronized及JUC顯式locks?使用原理解析

    這篇文章主要為大家介紹了synchronized及JUC顯式locks?使用原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 2023最新版本idea用maven新建web項(xiàng)目(親測不報錯)

    2023最新版本idea用maven新建web項(xiàng)目(親測不報錯)

    這篇文章主要給大家介紹了關(guān)于2023最新版本idea用maven新建web項(xiàng)目,Maven是當(dāng)今Java開發(fā)中主流的依賴管理工具,文中介紹的步驟親測不報錯,需要的朋友可以參考下
    2023-07-07
  • Spring Boot線程池使用的一些實(shí)用心得

    Spring Boot線程池使用的一些實(shí)用心得

    理論上線程越多程序可能更快,但在實(shí)際使用中我們需要考慮到線程本身的創(chuàng)建以及銷毀的資源消耗,以及保護(hù)操作系統(tǒng)本身的目的我們通常需要將線程限制在一定的范圍之類,這篇文章主要給大家介紹了關(guān)于Spring Boot線程池使用的一些實(shí)用心得,需要的朋友可以參考下
    2021-09-09
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之健身器材商城系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之健身器材商城系統(tǒng)的實(shí)現(xiàn)

    只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Jdbc+Servlet+Ajax+Fileupload+mysql實(shí)現(xiàn)健身器材商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-03-03
  • Mybatis-Plus支持GBase8s分頁查詢的實(shí)現(xiàn)示例

    Mybatis-Plus支持GBase8s分頁查詢的實(shí)現(xiàn)示例

    本文主要介紹了使?Mybatis-Plus?支持?GBase8s?的分頁查詢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • idea 使用Maven Helper idea的解決方法

    idea 使用Maven Helper idea的解決方法

    這篇文章主要介紹了idea 使用Maven Helper idea的解決方法,本文給大家介紹的非常詳細(xì)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Springboot配置圖片虛擬映射示例代碼

    Springboot配置圖片虛擬映射示例代碼

    這篇文章主要給大家介紹了關(guān)于Springboot配置圖片虛擬映射的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-11-11

最新評論

河间市| 深圳市| 高要市| 克山县| 栾川县| 安阳市| 洱源县| 尚义县| 昌邑市| 威远县| 易门县| 六安市| 通州区| 买车| 东乡| 蓝田县| 全州县| 华池县| 南川市| 郯城县| 沅江市| 西昌市| 万州区| 蒙自县| 闽清县| 西盟| 阿城市| 桂平市| 东乡族自治县| 介休市| 黑水县| 儋州市| 巴南区| 来宾市| 清远市| 永寿县| 资中县| 尖扎县| 陆良县| 石阡县| 台江县|