Readline слишком медленный - что-нибудь быстрее? - PullRequest
5 голосов
/ 13 октября 2011

Я читаю из потока, используя BufferedReader и InputStreamReader, чтобы создать одну длинную строку, которая создается из читателей.Он получает до 100 000 строк, а затем выдает ошибку 500 (сбой вызова на сервере).Я не уверен, в чем проблема, есть ли что-нибудь быстрее, чем этот метод?Он работает, когда количество строк исчисляется тысячами, но я работаю с большими наборами данных.

BufferedReader in = new BufferedReader(new InputStreamReader(newConnect.getInputStream()));
String inputLine;               
String xmlObject = "";
StringBuffer str = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    str.append(inputLine);
    str.toString();
}       
in.close();

Заранее спасибо

Ответы [ 2 ]

8 голосов
/ 13 октября 2011

для создания одной длинной строки, созданной читателями.

Вы случайно не делаете это, чтобы создать свою "длинную строку"?

String string;
while(...) 
 string+=whateverComesFromTheSocket;

Если да, то измените его на

StringBuilder str = new StringBuilder(); //Edit:Just changed StringBuffer to StringBuilder
while(...)
 str.append(whateverComesFromTheSocket);
String string = str.toString(); 

Строковые объекты неизменны, и когда вы делаете str + = "что-то", память перераспределяется, и str + "что-то" копируется в эту вновь выделенную область. Это дорогостоящая операция, и выполнить ее 51 000 раз крайне сложно.

StringBuffer и StringBuilder являются непостоянными братьями String и StringBuilder, поскольку несовместимость более эффективна, чем StringBuffer.

3 голосов
/ 13 октября 2011

readline () может читать со скоростью около 90 МБ / с, это то, что вы делаете с чтением данных, которое идет медленно.Кстати, readline удаляет символы новой строки, поэтому используемый вами подход некорректен, поскольку он превращает все в одну строку.

Вместо того, чтобы заново изобретать колесо, я бы посоветовал вам попробовать FileUtils.readLineToString () Это приведет к эффективному чтению файла как строки, без удаления новых строк.

...