|
|
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
Коряво, но попробуйте сделать быстрее на NIO. Код: 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 TestCopy > test.out): Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2012, 20:40:29 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
OOsalivanвторой ответДа, тут понятно уже. transferTo() пытается сразу целиком отобразить исходный файл на память (вызывается фунция ОС CreateFileMapping, затем MapViewOfFile с количеством байт равным длине файла), и для этих 84Мб, судя по всему, не получается найти непрерывный диапазон адресов из-за фрагментации. Не совсем еще понятно, почему диапазоны не освобождаются, но общая картина складывается как-то так. Basil A. SidorovКоряво, но попробуйте сделать быстрее на NIO.Две процедуры копирования файла: Код: 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. Поочередный запуск, 20 тыс.файлов суммарным объемом 3,3 Гб объединяются в один (время в секундах): copy1 - 512,7 copy2 - 313,4 copy1 - 389,5 copy2 - 304,6 copy1 - 384,7 copy2 - 308,2 По три запуска, 10 тыс.файлов суммарным объемом 1,7 Гб: copy1 - 193,9 copy1 - 195,9 copy1 - 194,6 copy2 - 152,5 copy2 - 153,1 copy2 - 152,3 Т.е. после заполнения кэша, время выполнения copy1 стабильно на 25-30% превышает время выполнения copy2. Basil A. SidorovКогда требуется объединить тысячи файлов в один, то никакой метод копирования не позволит не то чтобы убрать, а просто уменьшить накладные расходы на открытие файлов.Судя по полученным результатам, это утверждение не соответствует действительности. Basil A. SidorovЯ повторно озвучу размер буфера, который будет оптимальным для вашей задачи: один-два мегабайта . ... позволяет (лишь) сократить накладные расходы по копированию данных в памяти.Вот несколько решений, лежащих в основе ОС Windows: 1. Чтение-запись данных файла, file mapping и своп памяти реализуются одним и тем же средством диспетчера памяти; 2. Трансляция виртуальных адресов обеспечивает проецирование данных файлов на адресное пространство процессов (одного или нескольких); 3. Драйверы файловых систем не имеют собственного кэша, а пользуются системным кэшем, поддерживающим виртуальные блоки (смещения внутри файлов, а не дисковых разделов). Пострайтесь понять разницу между копированием данных в памяти и отображением одной и той же памяти на разные адреса и в разные процессы. Как это может влиять общую на производительность системы, с учетом медленных дисковых устройств, я написал в предыдущем сообщении. P.S. У меня нет желания Вам что-то доказывать и в чем-то убеждать. Надеюсь на взаимопонимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 21:21:15 |
|
||
|
NIO: OutOfMemoryError
|
|||
|---|---|---|---|
|
#18+
dgxP.S. У меня нет желания Вам что-то доказывать и в чем-то убеждать.Последний вопрос - почему в одной функции есть flush(), а в другой - нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 05:56:23 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37922251&tid=2131111]: |
0ms |
get settings: |
19ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
64ms |
get topic data: |
25ms |
get forum data: |
6ms |
get page messages: |
95ms |
get tp. blocked users: |
3ms |
| others: | 328ms |
| total: | 580ms |

| 0 / 0 |
