Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42

Параллельное чтение файла

18.01.2013, 15:43. Показов 7820. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
собственно сабж. Возможно ли ?
Суть такова, есть огромный текстовый файл, с ссылками, нужно считать ссылку, перейти по ней, если она доступна просканировать исходный код, если там найдется искомая строка, то эту ссылку поместить в другой файл. Т.к файлы содержат от 5000 ссылок (1 ссылка - 1 строка в файле), то важна скорость выполнения.

Возможно ли впринципе параллельное чтение 1 файла ?

Что хочу: хочу входной файл разбить на части, и каждому потоку, допустим их будет 5, передавать определенную часть файла, и они уже будут их параллельно сканировать.
С помощью класса RandomAccessFile и метода seek() можно устанавливать позицию каретки.

seek(long pos)
Sets the file-pointer offset, measured from the beginning of this file, at which the next read or write occurs.

Но как установить ее в определленую строку из файла ? Не попасть на середину файла ?
Может у кого есть другие соображение ?
Сама программа со всеми методами готова, но только 1 поток
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.01.2013, 15:43
Ответы с готовыми решениями:

Параллельное чтение книг
Здравствуйте! Начинаю учить C++ с нуля, полного. Накачал книг из темы Литература C++, читаю Стивена Прата. Подозреваю, что усвоение...

Параллельное чтение из txt файлов
Понадобилось воспользоваться параллельным чтением n текстовых файлов. Как можно реализовать?

Параллельное чтение и запись нескольких файлов
Нужно написать программу, которая параллельно копирует несколько файлов с помощью операций чтения/записи BinaryReader, BinaryWriter,...

20
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
18.01.2013, 16:14
Выложили бы здесь код,было бы полегче
0
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 16:20  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader buffer = new BufferedReader(new InputStreamReader(
                System.in));
        System.out.println("Type the path to your 'IN' file:\n");
        String path = buffer.readLine();
        System.out.println("Type search string:\n");
        String searchString = buffer.readLine();
        RandomAccessFile raf = new RandomAccessFile(path, "rw");
        raf.seek(0);
        long time = System.currentTimeMillis();
        String urlFromFile;
        String htmlCodeLine = null;
        long i = 0;
        long j = 0;
        while ((urlFromFile = raf.readLine()) != null) {
            try {
                URL url = new URL(urlFromFile);
                URLConnection urlConn = url.openConnection();
                urlConn.setConnectTimeout(1500);
                urlConn.setReadTimeout(1500);
                InputStream inStream = urlConn.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        urlConn.getInputStream()));
                System.out.println("====================");
                System.out.println(urlFromFile);
                System.out.println("====================");
                i++;
                while ((htmlCodeLine = br.readLine()) != null) {
                    System.out.println("CurrentLine = " + htmlCodeLine);
                    scannerHTML.ScannerHTML(htmlCodeLine, searchString,
                            urlFromFile);
                    j++;
                }
                inStream.close();
            } catch (MalformedURLException me) {
                System.out.println("====================");
                System.err.println("Unknown host: " + me);
                System.out.println("====================");
            } catch (IOException ioe) {
                System.out.println("====================");
                System.err.println("Input error: " + ioe);
                System.out.println("====================");
            }
        }
        System.out.println();
        System.out.println();
        System.out.println("===============================");
        System.out.println("================END OF SCAN=====");
        System.out.println("===============================");
        System.out.println();
        System.out.println();
        System.out.println("Get scanned: " + i
                + " URL's.                                   ");
        System.out.println("Total scanned lines: " + j
                + " lines.                                          ");
        System.out.println("Time passed: "
                + (System.currentTimeMillis() - time) + " msec.");
        System.out.println("("
                + (((System.currentTimeMillis() - time) / 1000) / 60)
                + " min.)");
        System.out.println();
        System.out.println();
        System.out.println("=====================================");
        System.out.println("================END OF SCAN===========");
        System.out.println("=====================================");
        raf.close();
    }
}
0
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
18.01.2013, 16:23
Незнаю,может я ошибаюсь,но если прочитать файл с помощю сканера,и каждую строку файла читать в новом потоке?
0
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 16:27  [ТС]
Не понял, поточней что ты имеешь ввиду ?
0
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
18.01.2013, 16:29
Прочитать файл с помощью сканера java.util.ScannerБи каждую строку читать в новом потоке,надо гуглить или послушать мудрых
0
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 16:44  [ТС]
Подождем умных
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
18.01.2013, 17:14
Параллельное чтение ни к чему хорошему не приводит - головки дисков будут постоянно позиционироваться в разные области, что сильно замедляет скорость чтения.

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

Если ссылок ОЧЕНЬ много и не хочется их все грузить - можно сделать динамическую подгрузку. Поток загружает сколько-то ссылок, допустим, 1000, и останавливается. Очередь разгребают другие потоки. Если в очереди осталось меньше 100 ссылок - поток подчитывает следующие 1000 ссылок.
0
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 17:23  [ТС]
А как это реализвать, если можно хотя бы наброски кода ?

Добавлено через 1 минуту
Да, 5000 это мизер, согласен, они даже в один поток читаются быстро. Но вот файлы с 200 000 ссылок уходят в вечность...
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
18.01.2013, 17:41
Цитата Сообщение от iCaesar Посмотреть сообщение
Да, 5000 это мизер, согласен, они даже в один поток читаются быстро. Но вот файлы с 200 000 ссылок уходят в вечность...
Это Вы что-то не так делаете. Я сгенерировал файл ссылок на 9 Мб, 200000 штук. Он читается за 0.15 секунды, весь.

Java
1
2
3
4
5
6
7
8
9
10
11
12
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./links.txt"), "UTF-8"));
List<String> links = new ArrayList<>(10000);
long start = System.currentTimeMillis();
while (true){
    String line = br.readLine();
    if (line == null)
        break;
    links.add(line);
}
long end = System.currentTimeMillis();
System.out.println("Load time: "+(end-start));
System.out.println(links.size());
Результат:
Code
1
2
Load time: 146
200000
0
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 17:52  [ТС]
Ссылки нужно не только считать, а еще перейти по ним и сканировать исходный код страницы

Добавлено через 6 минут
Проблемы со скоростью как раз таки при сканировании самого исходного кода возникают. И как это исправить потоками я пока не пойму.
0
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
18.01.2013, 17:55
Skipy,а можно все эти ссылки держать как бы уже прочитанными,не читать каждый раз файл,а в памяти,что-ли их держать,или вы считаете это плохим решением?

Добавлено через 41 секунду
Я просто пишу поисковик,и краулер (естественно)Очень интересна эта тема
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
18.01.2013, 17:57
Я так понял, что Вы говорили про чтение файла с диска (именно в этом контексте я упомянул "мизер").

А загрузка 200000 файлов по сети - это ПО ЛЮБОМУ будет долго. Особенно если в один поток. Если Вы даже 10 ссылок в секунду будете анализировать, что в один поток маловероятно, - это займет 20000 секунд, пять с половиной часов.

Полсотни потоков может сильно помочь.
0
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 18:03  [ТС]
А если взять все строки из файла записать в List а потом в несколько потоков передавать разные части этого листа, они ведь по индексам идут ?

Добавлено через 2 минуты
И каждый поток будет анализировать свою часть List'a, это возможно ?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
18.01.2013, 18:09
Цитата Сообщение от Ванеек Посмотреть сообщение
Skipy,а можно все эти ссылки держать как бы уже прочитанными,не читать каждый раз файл,а в памяти,что-ли их держать,или вы считаете это плохим решением?
Не совсем понял, какие именно ссылки. Из исходного файла? Можно.

Или прочитанные файлы? Если да - Вы представляете объем этих файлов? У Вас памяти хватит?

Добавлено через 2 минуты
Цитата Сообщение от iCaesar Посмотреть сообщение
А если взять все строки из файла записать в List а потом в несколько потоков передавать разные части этого листа, они ведь по индексам идут ?

И каждый поток будет анализировать свою часть List'a, это возможно ?
Это возможно. Но не очень хорошо. Представьте, что одному потоку достались маленькие файлы, а другому большие. И вот первый всё сделал - и отдыхает. Хотя мог бы второму помочь.

Вам нужна очередь (queue, например, java.util.concurrent.ConcurrentLinkedQue ue), из которой Вы могли бы извлекать из начала ссылки по одной. Каждый поток взял ссылку, обработал, взял следующую. И так пока они есть. Вот тут все будут работать параллельно пока не кончатся ссылки.
1
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
18.01.2013, 18:11
Цитата Сообщение от Skipy Посмотреть сообщение
Не совсем понял, какие именно ссылки. Из исходного файла? Можно.
Да,из исходного файла,или все-таки лучше по-обычному читать
0
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 18:12  [ТС]
Спасибо, погуглю на счет queue (Даже не знаю как читается правельно )
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
18.01.2013, 18:12
Цитата Сообщение от Ванеек Посмотреть сообщение
Да,из исходного файла,или все-таки лучше по-обычному читать
Зависит от задачи. Если память критична - можно подчитывать. Если ее много - можно держать. Как я уже показал, 200К ссылок помещаются в памяти элементарно и без проблем.
2
 Аватар для iCaesar
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 42
18.01.2013, 18:17  [ТС]
А можно пример использования этой queue ?

Добавлено через 2 минуты
AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, SynchronousQueue,

Их много оказывается
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.01.2013, 19:43
по поводу 200к и 9мб, у меня был код читавший по 8 хмл файла размерами по 150мб (хз сколько строк) в 8 потоков (там был рейд массив со скоростью 320), так вот:
скорость парсинга была увеличена только тогда, когда я перед парсингом их зазиповал и прямо из зип архива инпут стримами их грузил в память и парсил. Самое медленное на компе это винт, а рандом аксесс это ещё и усугубляет превращая линейное чтение в нелинейное, поэтому даже оврлоад по унзипу не сказался на скорости так как это тормозил винт
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2013, 19:43
Помогаю со студенческими работами здесь

Зеркальный том Windows 7. Есть ли параллельное чтение?
Почему чтение с зеркального тома Windows 7 производится только с одного диска? Разве оно не должно происходить со всех дисков параллельно?...

Параллельное чтение, обработка и запись в файл OpenMP
Необходимо в трёх потоках сделать обработку данных из файла: первый поток считывает всё, второй преобразует символы из нижнего регистра в...

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать обычную программу для расчета некоторых...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом документе. в прикреплённом коде текст вводится прямо в консоль,...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru