Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

 

  Вопрос: System.OutOfMemoryException Добавлено: 02.03.08 20:36  

Автор вопроса:  Кирилл | Web-сайт: kozlovssoft.z16.ru | ICQ: 467555686 
Пытаюсь создать программу, которая находит все папки в компьютере и копирует пути в массив. Для етого создал 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-сайт: kozlovssoft.z16.ru
 Профиль | | #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
а почему сразу не 32 гектара, по гектару на одно измерение?

Какие гектары? Речь идет об объеме которым наверное не владеет весь компьютерный парк мира вместе взятый!

Папки это древовидная структура, а такие структуры лучше всего обрабатывать рекурсией! и для этого понадобиться всего одномерный массив, и если верить Кирилу, то "понадобиться" всего одна планка на 1 гектар:)))))))


Все зависит от того какая именно обработка требуется.

Может быть вообще массив и не понадобится, может понадобится использовать ассоциативные списки, в зависимости от того опять же что именно будет делаться и как много.

Ответить

Номер ответа: 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

    ;Dim Folders(-1) As String
    ;Dim Files(-1) As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'вызов метода
        RecursivePath(";D:\Мультимедиа";)

        ' Список папок
        For Each FolderName As String In Files
            ListBox1.Items.Add(FolderName)
        Next

    End Sub

    Sub RecursivePath(ByVal FullName As String)
        ;Dim Count As Integer
        ;Dim 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-мерный массив?!!! Вы чего народ?! Это же полное извращение!

Кто-нибудь пробовал работать с 32-х мерным массивом? :)

        Dim kat(0, 0, 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, 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 ) на КАЖДУЮ папку.

Это только на первый взгляд, дальше даже смотреть не стала...

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам