
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
22.04.2017, 20:12
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Друзья, доброго времени суток! Помогите пожалуйста разобраться с проблемой. Есть тестовое приложение которое запускает 2 потока для сканирования 2х каталогов. В каждом из этих 2х потоках запускаются подпотоки по одному на каждый файл в каталоге. Объясните пожалуйста почему программа виснет на строке: Код: java 1. При этом, судя по логам метод FileScaner.call отрабатывает без проблем и возвращает результат. Полный код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: 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. 70. 71. Код: 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. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 20:23
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
R@monЕсть тестовое приложение которое запускает 2 потока для сканирования 2х каталогов. В каждом из этих 2х потоках запускаются подпотоки по одному на каждый файл в каталоге.Есть хоть одно разумное объяснение такой реализации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 20:47
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Basil A. Sidorov, 1. Мне нужно одновременно сканировать 8 каталогов. В каждом файлы своего формата. Два написал для примера. 2. FileScaner будет разбирать конкретный файл (размер файла 100-200 МБ), так что тут будет основная работа. Ну и строить из него List<DBFObj> или List<CSVObj> в зависимости от типа файла. Что конкретно не так со структурой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 21:06
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Должны быть очевидны два фундаментальных изъяна вашего дизайна: 1. Дисковый ввод-вывод, в целом, является последовательным. SSD несколько изменяют ситуацию, но ускорить обработку "одновременным" чтением кучи файлов - вряд ли получится; 2. Я, конечно, разорялся на тему "не надо экономить потоки", но на моей прошлой работе было вполне рядовое хранилище, вполне средней системы, содержавшее несколько миллионов файлов. Даже на 64-разрядных системах проблемы начнутся гораздо раньше, чем вы сможете обработать "тридцать тыщ одних курьеров файлов". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 21:14
|
|||
|---|---|---|---|
ExecutorCompletionService |
|||
|
#18+
R@monМне нужно одновременно сканировать 8 каталогов. а считывающая головка - одна(. Одним потоком составьте список и отдать его в несколько потоков уже с готовым списком файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 21:22
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Друзья, возможно реализация в целом хромает и возможно даже на обе ноги. Я бы не хотел углубляться в этот вопрос. Может кто-то подсказать, по сути вопроса, что не так с ExecutorCompletionService? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 21:24
|
|||
|---|---|---|---|
ExecutorCompletionService |
|||
|
#18+
R@monЯ бы не хотел углубляться в этот вопрос тебе решать. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 21:33
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
R@monДрузья, возможно реализация в целом хромает и возможно даже на обе ноги. Я бы не хотел углубляться в этот вопрос.Я тоже не хочу углубляться. Только в реализацию кривого дизайна.Может кто-то подсказать, по сути вопроса, что не так с ExecutorCompletionService?"Меня опять терзают смутные сомнения", что Stream API Java8 делает всё, что вам нужно и даже больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 21:37
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Basil A. Sidorov, У меня есть ограничения Java6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 22:10
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
R@monУ меня есть ограничения Java6Но доку-то всё равно надо читать? ExecutorCompletionService организует очередь задач, на предоставленном вами исполнителе. Вы, вместо того, чтобы дать сервисному компоненту спокойно работать вы бьете его по рукам, (за каким-то лешим) выключая из работы исполнителя: где тут shutdown ?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 22:35
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Basil A. Sidorov, shutdown для исполнителя говорит лишь о том, что больше не принимаются задачи в очередь. Те что уже есть продолжают работать. Это так, что касается документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 22:38
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Хотя смотрю на весь этот букет кода и классов ... Вот задлянафига вся эта развесистая клюква, если последовательный проход по массиву со списком файлов справится точно так же, но гораздо проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 22:50
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Basil A. Sidorov, Показанный пример очень упрощен, что бы показать лишь суть происходящего. Я не могу понять, что во всем этом я делаю не так. Почему не прокидывается ответ. Вот нагуглил пример, все работает как надо. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 22:53
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
R@monshutdown для исполнителя говорит лишь о том, что больше не принимаются задачи в очередь. Те что уже есть продолжают работать. Это так, что касается документации."Иногда не помогает даже чтение газет". Вы отправили тысячу заданий на однопоточный исполнитель. Это настолько быстро, что ещё до того, как будет выполнено ваше первое задание (перенос файла из каталога в каталог), исполнитель прекратит принимать новые задания. Мне сложно оценить высоты полёта ваших мыслей, но есть в них что странное - лично я не стал бы даже гадать о возможных вариантах поведения сервисной обёртки над остановленным исполнителем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 22:55
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
R@monВот нагуглил пример, все работает как надоВместо бессмысленного гуглежа надо сделать по примеру из доки, а ещё лучше - выкинуть изначально дрянную идею и ещё раз подумать над дизайном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 23:01
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
sleep - отдельный косяк: хотите взять театральную паузу - используйте wait. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 23:11
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Basil A. Sidorov, Пример в точности по документации, ссылку на которую вы предоставляли. Количество потоков тут не важно. Все готовые результаты хранятся в коллекции. Если есть готовый результат, то service.take() получает его по первому запросу, если результата еще нет, то происходит блокировка и ожидание первого готового. Я надеялся получить ответ (или предположение) на конкретный вопрос. Если у вас такого нет, надеюсь поможет кто-либо еще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.04.2017, 23:20
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
R@monПример в точности по документации, ссылку на которую вы предоставляли. и где в доке shutdown? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Ладушки - успехов в костылестроении и граблехождении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.04.2017, 00:16
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Претензии к наличию shutdown - снимаются. Претензии к кривизне дизайна - остаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 09:21
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Выспался и еще раз прочитал код, все оказалось проще чем кажется. Для того что бы service мог знать о задачах которые завершились надо в него и делать submit. Я же в примере делаю его в executor. Поменял, все заработало. Теперь что касается "кривизны дизайна". Я так понимаю, что основной недочет в том, что большое количество потоков будет использовать большое количество файлов. При этом узким местом остается ввод\вывод. Как избавиться от этого? Первым и основным потоком прочитать все файлы в память? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 09:47
|
|||
|---|---|---|---|
ExecutorCompletionService |
|||
|
#18+
R@monПервым и основным потоком прочитать все файлы в память? не содержимое, а имена файлов. Идеально - не читая сами файлы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 10:00
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
Petro123, Так я вроде это и делаю... Читаю имена файлов и передаю ссылку на один файл в каждый поток, что бы они не мешали друг другу. Каждый поток работает со своим файлом, нет? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 10:19
|
|||
|---|---|---|---|
ExecutorCompletionService |
|||
|
#18+
R@monЧитаю имена файлов и передаю ссылку на один файл в каждый поток, что бы они не мешали друг другу. Каждый поток работает со своим файлом, нет? нет. 1. Я думал ты искать будешь по какому то критерию файлы. Это долгая операция и занимает все ресурсы машины. Её не распараллелить. Потом ты СПИСОК как входнй параметр передаёшь в поток для разбора. И старт потока. Итого на клик кнопки у тебя завис на время поиска и потом поток в фоне делает работу хоть 8 часов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 16:23
|
|||
|---|---|---|---|
|
|||
ExecutorCompletionService |
|||
|
#18+
R@monЯ так понимаю, что основной недочет в том, что большое количество потоков будет использовать большое количество файлов. При этом узким местом остается ввод\вывод. Как избавиться от этого? Первым и основным потоком прочитать все файлы в память?В оптимизированном коде легко запутаться, но общая стратегия для поточной обработки примерно такая. Выделяется один (несколько) больших байтовых массивов (порядка сотен мегабайт каждый). Из этих массивов "берутся" блоки (8-32КБ) в/из которых читает/пишет с которыми работают или один поток или два (отдельно на чтение и запись). Т.е. файлов (в вашем случае) будет открыто по числу входных/выходных для типов/каталогов, т.к. быстрее, чем последовательная обработка по каждому типу всё равно не получится. Технически это будет ByteBuffer поверх byte[] и реализация интерфейсов разборки/сборки (scatter/gather) из NIO. Головоломная часть - управления блоками и синхронизация. Тут я даже псевдокод не готов предложить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&tablet=1&tid=2122954]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
91ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 448ms |

| 0 / 0 |
