Страница: 1 | 2 | 3 | 4 | 5 | 6 |
Вопрос: System.OutOfMemoryException
Добавлено: 02.03.08 20:36
Автор вопроса: Кирилл | Web-сайт:
Пытаюсь создать программу, которая находит все папки в компьютере и копирует пути в массив. Для етого создал 32-х мерный масив. Запустил программу а vb выдал ошибку
Exception of type 'System.OutOfMemoryException' was thrown.
Обьесните, пожалуйста, что ето может значить и как ето устранить.
Программный код http://www.kozlovssoft.z16.ru/other/Papki.zip
Ответы
Всего ответов: 82
Номер ответа: 1
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #1
Добавлено: 02.03.08 22:29
Купи 6 гектаров памяти и будит тебе щасте.
А если по существу, то для поиска всех папок на компе не нужен 32-хмерный (sic!) массив строк.
Придумай другой алгоритм или погугли примеры.
Номер ответа: 2
Автор ответа:
Кирилл
ICQ: 467555686
Вопросов: 4
Ответов: 3
Web-сайт:
Профиль | | #2
Добавлено: 02.03.08 23:26
В процесах он забирает всего 16 метров из 2 гектаров
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 03.03.08 09:27
Windows просто не дает выделить такой объем памяти приложению.
Насколько я помню (сейчас лень читать документацию), на каждый элемент массива требуется 4 байта на ссылку (или 8 байта в 64-битной Windows).
Можешь посчитать - для твоего массива требуется выделить порядка 8*10^84 терабайт.
Для решения твоей задачи достаточно одномерного списка List(Of String)
Номер ответа: 4
Автор ответа:
fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #4
Добавлено: 03.03.08 11:10
а почему сразу не 32 гектара, по гектару на одно измерение? Папки это древовидная структура, а такие структуры лучше всего обрабатывать рекурсией! и для этого понадобиться всего одномерный массив, и если верить Кирилу, то "понадобиться" всего одна планка на 1 гектар)))))) P.S. - но здравый смысл подсказывает, что таких объемов не надо, можно обойтись максимум десятком вторым мегабайт
Номер ответа: 5
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 03.03.08 11:43
Какие гектары? Речь идет об объеме которым наверное не владеет весь компьютерный парк мира вместе взятый!
Все зависит от того какая именно обработка требуется.
Может быть вообще массив и не понадобится, может понадобится использовать ассоциативные списки, в зависимости от того опять же что именно будет делаться и как много.
Номер ответа: 6
Автор ответа:
fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #6
Добавлено: 03.03.08 11:47
ну в условии, надо найти список папок, а список может быть и ассоциативным, но имхо простой массив шустрее любого ассоциативного
Номер ответа: 7
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 03.03.08 11:50
Но никак не 32-х мерный массив с размерностью каждого элемента 1000 - тупо потому что вложенность может быть больше 32-х элементов, и в папке может быть больше 1000 подпапок.
Номер ответа: 8
Автор ответа:
fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #8
Добавлено: 03.03.08 11:54
а я разве говорил о 32-х измерениях? достаточно 1-го! а вложений может быть хоть тыща, лишь бы хватило стека на их рекурсивный перебор
Номер ответа: 9
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #9
Добавлено: 03.03.08 11:59
Нахер 32-мерный массив?!!! Вы чего народ?! Это же полное извращение!
Гораздо проще одномерный, в котором хранятся все пути + еще парочка с индексами для более быстрого поиска.
Номер ответа: 10
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #10
Добавлено: 03.03.08 12:02
Хочешь провести бенчмарк?
Условия простые - необходимо сгрузить иерархию папок и файлов в память.
Ну а замерять время - например подсчет количества файлов в папке и всех подпапках )разумеется, данные брать из ОЗУ
Номер ответа: 11
Автор ответа:
fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #11
Добавлено: 03.03.08 12:32
Imports System.IO
Public Class Form1
 im Folders(-1) As String
 im Files(-1) As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'вызов метода
RecursivePath(":\Мультимедиа"
' Список папок
For Each FolderName As String In Files
ListBox1.Items.Add(FolderName)
Next
End Sub
Sub RecursivePath(ByVal FullName As String)
 im Count As Integer
 im RootPath As New DirectoryInfo(FullName)
'перебор всех папок
For Each SubFolder As DirectoryInfo In RootPath.GetDirectories
' обработка исключений
Try
Count = Folders.Length
ReDim Preserve Folders(Count)
Folders(Count) = SubFolder.FullName
' Поиск всех фалов в папке
For Each File As FileInfo In SubFolder.GetFiles
Count = Files.Length
ReDim Preserve Files(Count)
Files(Count) = File.FullName
Next
' Если есть вложения, рекурсия
If SubFolder.GetDirectories.Length > 0 Then
RecursivePath(SubFolder.FullName)
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
Next
End Sub
End Class
Номер ответа: 12
Автор ответа:
fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #12
Добавлено: 03.03.08 12:32
а то развели демагогию
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 03.03.08 13:41
Кто-нибудь пробовал работать с 32-х мерным массивом?
1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, _
1, 1) As Byte
Если хотя бы одну размерность увеличить, получите исключение!
Не догоняю зачем вообще может понадобиться такая размерность
Номер ответа: 14
Автор ответа:
fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #14
Добавлено: 03.03.08 13:45
Слушай тебе уже готовый рабочий пример показали(с одномерным массивом)? а ты все пыль подымаешь?
Номер ответа: 15
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #15
Добавлено: 03.03.08 14:03
fluke: в топку твой пример - кривой он!
Недостатки:
1. Необоснованное и неоправданное использование DirectoryInfo и FileInfo вместо более подходящих строковых вариантов перегрузки
2. Ты ДВАЖДЫ получаешь данные(DirectoryInfo ) на КАЖДУЮ папку.
Это только на первый взгляд, дальше даже смотреть не стала...