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

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

18.01.2013, 15:43. Показов 7772. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru