2010-06-11 2 views
4

Я хочу прочитать большой текстовый файл, что я решил создать четыре потока и прочитать 25% файлов по каждому из них. , а затем присоединиться к ним.Я хочу прочитать большой текстовый файл

, но его не впечатляет. может кто-нибудь сказать мне, я могу использовать параллельное программирование для того же самого. как моя файловая структура есть некоторые данные как имя контакт compnay policyname policynumber uniqueno

и я хочу поместить все данные в hashmap наконец.

благодаря

ответ

0

Ну, вы можете очистить кэш диска и поставить высокую конкуренцию на синхронизацию HashMap, если вы делаете это так. Я бы предположил, что вы просто убедитесь, что буферизировали поток правильно (возможно, с большим размером буфера). Используйте конструктор BufferedReader(Reader in, int sz), чтобы указать размер буфера.

Если шея бутылки не разбирает линии (то есть, горлышко бутылки не используется ЦП), вы не должны распараллелить задачу описанным образом.

Вы также можете просматривать файлы с отображением памяти (доступны через пакет nio), но это, вероятно, полезно только если вы хотите прочитать и эффективно писать файлы. Учебное пособие с исходным кодом доступно здесь: http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_029.htm

1

Если это большой файл, то вероятность того, что он записан на диск как неотъемлемая часть, и «потоковая передача» данных будет быстрее, чем параллельное чтение, так как это начнет перемещать направляет назад и вперед. Чтобы узнать, что быстрее, вам нужны интимные знания о вашей целевой производственной среде, потому что на высокопроизводительном хранилище данные, скорее всего, будут распределены по нескольким дискам, а параллельные чтения могут быть быстрее.

Лучший подход - я думаю, это прочитать его с большими кусками в память. Сделать его доступным как ByteArrayInputStream для синтаксического анализа.

Скорее всего, вы будете привязывать процессор во время разбора и обработки данных. Возможно, параллельное сокращение карт может помочь здесь распределить нагрузку по всем ядрам.

+0

«Если это большой файл, возможно, что он записан на диск как неотъемлемая часть» - вы имеете в виду, что это * не * смежный? –

+0

Я имею в виду, что он, вероятно, смежный. Фрагментация диска, чередование, может повлиять на это. В большинстве случаев дисковые системы оптимизированы для быстрого последовательного чтения. –

9

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

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

+0

, если вы делите файл в куске и прочитайте его другим потоком и получите данные в параллельной коллекции. это повышение производительности – Pedantic

+0

Если я правильно понимаю, вы все еще говорите о чтении файла из более чем одного потока? Если это так, это не улучшит производительность. Пусть один поток прочитает файл и передаст кусок свободному рабочему потоку (используйте очередь заданий или что-то подобное). Таким образом, вы можете использовать всю вычислительную мощность для обработки данных. С другой стороны, вы можете использовать профилировщик, чтобы выяснить, где на самом деле узкие места. – OregonGhost

+0

спасибо, я догадался, пошел своим путем .. – Pedantic

0

хорошо вы можете воспользоваться помощью ссылки ниже

http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

ИЛИ

с использованием большого буфера

или с помощью этого

импорта java.io.*;

общественного класса line1 {

public static void main(String args[]) { 
    if (args.length != 1) { 
    System.err.println("missing filename"); 
    System.exit(1); 
    } 
    try { 
    FileInputStream fis = 
     new FileInputStream(args[0]); 
    BufferedInputStream bis = 
     new BufferedInputStream(fis); 
    DataInputStream dis = 
     new DataInputStream(bis); 
    int cnt = 0; 
    while (dis.readLine() != null) 
     cnt++; 
    dis.close(); 
    System.out.println(cnt); 
    } 
    catch (IOException e) { 
    System.err.println(e); 
    } 
} 

}

1

Вы можете использовать Отображаемые в памяти буферов файлов (NIO) вместо обычного java.io.

Смежные вопросы