繁体   English   中英

运行时间优化

[英]Run time optimisation

我需要从文本文件读取,将所有“,”替换为“ \\ n”,然后将结果写入新的文本文件。 我的文本文件很大(16MB),需要几个小时才能完成此任务。 还有其他方法可以更快地实现它吗?

public static void main(String [] args) throws IOException {
        String fileName = "file1.txt";  // The name of the file to open.
        String s="";                // This will reference one line at a time

        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
        int c, n=0;
        char character;

        while((c = reader.read()) != -1) {
           character = (char) c;
           if ( character == ',')
               s = s + "\n";
           else
               s += character;
        }
        reader.close();

        PrintWriter out = new PrintWriter("fileName1.txt");

        out.println(s);   
        out.close();
}
  1. 而不是逐字符读取,而是逐行读取。
  2. 对于每一行读取,通过调用replaceAll()方法将所有逗号替换为“ \\ n”。
  3. 使用BufferedWriter

还有其他方法可以更快地实现它吗?

主要瓶颈是以下语句:

       if ( character == ',')
           s = s + "\n";
       else
           s += character;

基本上,您正在为输入文件中的每个单个字符进行字符串连接。 如果文件中有N个字符,则说明您正在创建N个字符串,而这些级联将复制大约N * (N + 1) / 2字符。 如果N为16,000,000 ,那么您正在谈论的是复制的大量字符。 (还有很多垃圾收集。)

如果您只是想避免串联,解决方案是将String s替换为StringBuilder s ...,然后使用append操作来构建输出字符串。

但是,在这种情况下,最好的解决方案是为输出文件打开BufferedWriter并将字符直接写到该文件...而无需构建内存中的字符串。


跟进

你什么意思?

我的意思是这样的:

public static void main(String[] args) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader("in.txt"));
         BufferedWriter writer = new BufferedWriter(new FileWriter("out.txt"))) {
        int c;
        char character;
        while ((c = reader.read()) != -1) {
            character = (char) c;
            if (character == ',')
                writer.write('\n');
            else
                writer.write(character);
        }
    }
}

请注意,我正在使用Java 7“尝试使用资源”语法。 在try-catch-finally语句完成时,资源(即流)将自动关闭。

如果您使用某种Unix,则可以使用命令行。

sed 's/,/\n/g' input.txt > output.txt

时间花费在连接字符串上。 没有必要这样做。 您可以在处理完每一行后写出每一行,或者也可以写出每个字符:如果是后者,请确保将FileWriter包装在BufferedWriter.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM