Чытанне тэкставага файла з дапамогай BufferedReader.readLine () занадта павольна

Я спрабую прачытаць тэкставы файл, які змяшчае каля 1000 вельмі доўгіх ліній. Увесь файл складае каля 1.4MB. Я выкарыстоўваю метад ReadLine BufferedReader для чытання файла. Што адбываецца, гэта займае 8-10 секунд, каб надрукаваць вывад на кансоль. Я паспрабаваў той жа з дапамогай fgets РНР і друкуе ўсе тыя ж радкі ў імгненні вока !!! Як гэта магчыма? Ніжэй прыведзены код, я выкарыстоўваю

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClickLogDataImporter {
    public static void main(String [] args) {
        try {
            new ClickLogDataImporter().getFileData();
        } catch (Exception ex) {
            Logger.getLogger(ClickLogDataImporter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void getFileData() throws FileNotFoundException, IOException {
        String path = "/home/shantanu/Documents";
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(path+"/sample.txt")));
        String line = "";
        while((line = (br.readLine())) != null) {
            System.out.println(line);
        }

    }
}

PHP код

<?php
    $fileName = "/home/shantanu/Documents/sample.txt";
    $file = fopen($fileName, 'r');
    while(($line = fgets($file)) != false) {
        echo $line."\n";
    }
?>

Калі ласка, прасьвятліць мяне па гэтым пытанні

3
ды і ў камандным радку
дададзена аўтар Shades88, крыніца
добра, калі я закаментаваць кансольны выснова. Java займае каля 80-90ms і PHP ня прымае больш за 5 мс! Я праверыў яго. Але гэта так
дададзена аўтар Shades88, крыніца
калі ласка, праверце адрэдагаваны код. Як правільна растлумачыць Djon, я рабіў дзве непараўнальныя працэсы. Чытанне парадкова і скід ўсяго змесціва дзве розныя рэчы. Такім чынам, я выканаў яшчэ адно выпрабаванне, зараз з дапамогай fgets. І вынік усё той жа
дададзена аўтар Shades88, крыніца
Я assue, абедзве праграмы выконваюцца такім жа чынам, а таксама з каманднага радка?
дададзена аўтар Danubian Sailor, крыніца
Добра, такім чынам, у які момант вы пачынаеце вымяраць час? Я не бачу, што ў кодзе. Такім чынам, праблема можа быць у JRE час загрузкі, а не падчас выканання кода.
дададзена аўтар Danubian Sailor, крыніца
Так што, напэўна, колькі патрабуецца для загрузкі класаў за System.out.println. Вы павінны зрабіць першапачатковы System.out.prinlnt (), і чым пачаць таймер.
дададзена аўтар Danubian Sailor, крыніца

6 адказы

Чытачы, як правіла, павольна, вы павінны паспрабаваць чытач Патоку, якія хутка. І пераканайцеся, што працэс адкрыцця файла не бярэ час. Калі файл адкрыты і аб'екты патоку ствараюцца, а затым вымераць час, то вы можаце дакладна высветліць, што адбываецца з-за адкрыццё файла праблемы або чытанне пытання файла. Пераканайцеся, што сістэма ІА нагрузкі не высокая падчас гэтай аперацыі, у адваротным выпадку вы вымярэнне сапсуецца.

 BufferedInputStream reader=new BufferedInputStream(new FileInputStream("/home/shantanu/Documents/sample.txt"));
 byte[] line=new byte[1024];
 while(reader.read(line)>0) {
 System.out.println(new String(line));
 }
1
дададзена
Гэта па-ранейшаму робіць тую ж працу - пераўтварэнне двайковых дадзеных у тэкставыя дадзеныя - толькі ў іншым пункце. Акрамя таго, мяркуючы, выкарыстоўваючы InputStream для тэкставых дадзеных прынцыпова дрэнная ідэя. Напрыклад, код можа ў канчатковым выніку чытанне <�я> частка </я> сімвала (напрыклад, першы байт сімвала двухбайтным з выкарыстаннем UTF-8), і вы ніколі не ведаеце. Больш за тое, ваш код не выкарыстоўвае вяртаецца значэнне чытаць , так што вы ствараеце радок, выкарыстоўваючы ўвесь буфер Ці гэта ці не, поўны карысных дадзеных.
дададзена аўтар Jon Skeet, крыніца

8 секунд для таго, што код гукаў шмат занадта доўга для мяне. Я падазраю, што-то яшчэ адбываецца, калі шчыра. Вы ўпэўненыя, што гэта не суцяшае выхад, які займае шмат часу?

Я прапаную вам час, (напрыклад, System.nanoTime ) выпісваючы агульны час у канцы, але запусціць яго з дапамогай кансолі мінімізавана. Я падазраю, што вы знойдзеце гэта досыць хутка, то.

0
дададзена
Я праводзіў адзін і той жа тэст. каментуючы кансольны выснова, Java займае 80-90ms аднак, PHP прымае толькі 3-5ms !!
дададзена аўтар Shades88, крыніца
абодва кода друк лініі на кансолі. Тым не менш PHP б'ецца!
дададзена аўтар Shades88, крыніца
@ Shades88: Я думаю, у той момант гэта залежыць ад кэшавання АС ... і JIT кампіляцыі. Вы можаце выявіць, што пры выкананні гэтага метаду некалькі разоў, гэта вельмі хутка. Ці з'яўляецца гэтая праграма на самай справе прадстаўнік, што вы спрабуеце зрабіць, хоць, ці ж вы проста спрабуеце параўнаць хуткасць PHP і Java? Калі так, то гэта не вельмі карысна параўнанне ИМО.
дададзена аўтар Jon Skeet, крыніца
@ Shades88: Можа быць, PHP мае больш хуткі доступ да кансолі па некаторых прычынах. Я вельмі сумняваюся, што час бярэцца <�я> чытанне </я> файл. Гэта лёгка праверыць гэта. Калі вы пазбавіцеся ад выхаду кансолі ў Java - проста злічыць радкі, якія вы прачыталі і выпісваць, што колькасць у канцы, напрыклад, - колькі часу гэта зойме?
дададзена аўтар Jon Skeet, крыніца

Я не ўпэўнены, але я думаю, што PHP проста друкуе файл, дадзены метад, які вы выкарыстоўвалі, Java чытае файл і атрымлівае кожныя радкі з яго, гэта азначае, што правяраць кожны знак для лініі выключальніка, працэс, здаецца, не быць аднолькавымі ўсё.

string file_get_contents

Калі вы спрабуеце друкаваць кожную лінію па адным з файла з PHP, ён павінен быць больш павольна.

0
дададзена
Калі ласка, праверце адрэдагаваны код. Цяпер я fgets ў PHP. Так што чытайце ўсе радкі, па адным. Вынік не мяняўся
дададзена аўтар Shades88, крыніца
я бягу як ад абалонкі.
дададзена аўтар Shades88, крыніца
ёсць 1000 радкоў і кожны радок даўжынёй не менш за 1000 сімвалаў
дададзена аўтар Shades88, крыніца
у тым, што? Java або PHP?
дададзена аўтар Shades88, крыніца
дададзена аўтар Djon, крыніца
Я зрабіў файл з 1000 радкоў 1000 нулёў, файл 978 КБ, спатрэбілася 0 мс для загрузкі і 1404 мс для друку на кансолі Netbeans '.
дададзена аўтар Djon, крыніца
Калі вы можаце даць ўзор файла, або дайце нам памер і колькасць радкоў, я магу праверыць абодва метаду і сказаць вам, калі ў мяне ёсць адны і тыя ж вынікі.
дададзена аўтар Djon, крыніца
Вы карыстаецеся PHP з браўзэра або абалонкі? Затым ён павінен быць ваш вывад на кансоль, выдаліце ​​ System.out.printl (радок) і паглядзець, як доўга ён прымае.
дададзена аўтар Djon, крыніца

Хіба гэта не проста вывад на кансоль, якая павольна? Зараз, калі вы ведаеце, што вы файл правільна чытаць, паспрабуйце закаментаваўшы радок System.out.println (лінія); .

0
дададзена

file_get_contents загружае усё змесціва файла ў радок, з дапамогай кода ў Java вы чытаеце і друк па радках. Калі вы правяраеце ўнутры IDE як Eclipse, выснова кансолі можа быць даволі павольным. Калі вы хочаце, дакладнае паводзіны file_get_contents, вы можаце выкарыстоўваць гэты брудны код:

 File f = new File(path, "sample.txt");
 ByteArrayOutputStream bos = new ByteArrayOutputStream(new Long(Math.min(Integer.MAX_VALUE, f.length())).intValue());
 FileInputStream fis = new FileInputStream(f);
 byte[] buf = new byte[1024 * 8];
 int size;
 while((size = fis.read(buf)) > 0) {
    bos.write(buf, 0, size);
 }
 fis.close();
 bos.close();
 System.out.println(new String(bos.toByteArray()));
0
дададзена

Ну, калі вы карыстаецеся г Readline ён будзе ісці і прачытаць файл ў 1000 раз для кожнага радка. Паспрабуйце выкарыстоўваць функцыю чытання з вельмі вялікім буферам сказаць больш 28000 або каля таго. Ён будзе чытаць файл сказаць, у агульнай складанасці 60 разоў за 1,4 Мб, якая нашмат менш, чым 1000. Калі і выкарыстоўваць невялікі буфер 1000, то яго будзе чытаць файл вакол 1300 ці нешта, які нават павольней, за 1000 (ReadLine) , Акрамя таго, пры друку радкоў выкарыстоўвайце друк замест Println, так як лініі не дакладна лініі, але масіў знакаў.

0
дададзена