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 

Ответить

  Ответы Всего ответов: 82  

Номер ответа: 46
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #46 Добавлено: 04.03.08 13:24
Что за детский сад?
Код работы с файловой системой вставить в исходник.

Ответить

Номер ответа: 47
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #47 Добавлено: 04.03.08 13:28
Свою мега-библиотеку где-нибудь выложи, я здесь свой E-mail светить не намерен.

Ты разумеется понял что мне нужен исходный код библиотеки а не сама dll.

Ответить

Номер ответа: 48
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #48 Добавлено: 04.03.08 14:04
линк на библиотеку clsReadFiles.dll http://slil.ru/25543583

Ответить

Номер ответа: 49
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #49 Добавлено: 04.03.08 18:32
Выложи исходный код библиотеки, без него ни один человек на форуме твою библиотеку даже качать не будет.

Далее можно будет продолжить разговор.

Это вопрос не принципа как ты говоришь, а вопрос банального дол****ства - запускать неизвестные неподписанные бинарики скачаные с каких-то помоек.

Ответить

Номер ответа: 50
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #50 Добавлено: 04.03.08 18:48
не один человек на форуме не называет чужой код г****м, только по тому, что алгоритм расходиться с его личными убеждениями. я тебе предлагал, лично, выслать библиотеку. верить на слово, я бы тоже не стал. если не веришь моей порядочности, можешь написать сам, используя api, если конечно сможешь:))))) уверяю тебя, результат тебя порадует, ну по крайней мере научишься пользоваться иными функциями

Ответить

Номер ответа: 51
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #51 Добавлено: 04.03.08 19:05
не один человек на форуме не называет чужой код г****м, только по тому, что алгоритм расходиться с его личными убеждениями.

Я не называл твой код г***м потому что твой алгоритм расходится с моими личными убеждениями.

Я назвал твой код г***м потому что твой код и есть г***но и я не одинок в этой позиции.

я тебе предлагал, лично, выслать библиотеку

Повторяю еще раз, меня не интерисует библиотека, меня интерисует К О Д.

верить на слово, я бы тоже не стал. если не веришь моей порядочности, можешь написать сам, используя api, если конечно сможешь:)))))

Сходу не смогу тем более что я за последние 3 года не использовал ничего кроме FCL

уверяю тебя, результат тебя порадует

Чем порадует?
Я прекрасно осознаю какой результат получу и ничего радостного я здесь не вижу.

ну по крайней мере научишься пользоваться иными функциями

Повторюсь, за последние 3 года я не использовал ничего кроме FCL. Втечение следующих 5 лет ничего другого использовать не планирую. Смысла учиться тому что мне не понадобится не вижу, я все-таки человек который ценит свое время (а не только трубит об этом на углу)

Ответить

Номер ответа: 52
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #52 Добавлено: 04.03.08 19:33
Кстати, fluke, начинаешь заговариваться!

Всем желающим посмотреть его исходник, могу выслать на почту!


ВОТ ОН Я ЖЕЛАЮЩИЙ!!!! Почему мне не был предоставлен исходник?

Или там походу такая лажа что показывать стыдно народу? :)

Ответить

Номер ответа: 53
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #53 Добавлено: 05.03.08 10:13
чувак, я так понял что для тебя скорость критична. использование API дает двойной прирост производительности. а ты говоришь, все это лажа. вместо 10 минут, твой код будет работать 20 минут. ты просто не знаешь, как это делать и пытаешься съехать!
Вот оно поколение программистов, взращенное на обертках

Ответить

Номер ответа: 54
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #54 Добавлено: 05.03.08 10:20
уморил вот тебе пример статьи на VB6.0
Рекурсивный поиск файлов и папок
(обращений: 8891 )


В этой статье описывается минимальный код для поиска файлов и папок с использованием API функций FindFirstFile, FindNextFile и FindClose. Данный пример поиска довольно прост, он позволяет задать только одиночный запрос: "*.*" или "*", запрос с несколькими файлами не даст результатов: "*.bmp,*.gif". Его принцип таков:
Ищем все подкаталоги в папке, в которой был указан поиск.
В каждом найденном подкаталоге ищем файлы, указанные для поиска.
Для реализации принципа, во - первых, нам потребуется создать функцию поиска папок:

Private Sub SearchForFolders(fName As String, Path As String, File As String) 'fName - указывает, какие подкаталоги будем искать("*" - все подкаталоги, как и в нашем случае); Path - указывает, в какой папке будем искать; File - указывает, какой файл будем искать.
If StopSearch = True Then Exit Sub 'переменная StopSearch указывает, должен ли быть прерван поиск.
Dim Atr As Integer
Dim hFnd As Long
Dim WFD As WIN32_FIND_DATA
hFnd = FindFirstFile(Path & fName, WFD) 'ищем первый подкаталог.
If hFnd = INVALID_HANDLE_VALUE Then Exit Sub 'если подкаталог не найден, то выходим из функции.
SearchForFiles File, Path 'вызывает ещё одну фнкцию для поиска файлов в папке.
Do
Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) 'узнаём, является ли найденный файл папкой
If TrimNull(WFD.cFileName) <> "." And TrimNull(WFD.cFileName) <> ".." Then 'если папка не является корневой на диске, то функция FindNextFile возвращает эти два значения.
If Atr > 0 Then
DoEvents
SearchForFolders fName, Path & TrimNull(WFD.cFileName) & "\", File 'Если файл является папкой, то снова вызываем функцию поиска подкаталогов в этой папке.
End If
End If
Loop While FindNextFile(hFnd, WFD) 'производим поиск до конца.
FindClose hFnd 'освобождаем память.
End Sub

Думаю, что всем понятен принцип этой функции: производится поиск всех папок, для каждой папки производится поиск подкаталогов и так далее, пока не будут найдены все папки - в этом и заключается рекурсия. Одновременно с поиском папок в них производится поиск указанного файла. Функция для поиска файлов почти аналогична функции поиска папок:

Private Sub SearchForFiles(fName As String, Path As String) 'Path - указывает в какой папке будет производится поиск фалов, указанных в параметре fName.
If StopSearch = True Then Exit Sub
Dim Atr As Integer
Dim hFnd As Long
Dim WFD As WIN32_FIND_DATA
hFnd = FindFirstFile(Path & fName, WFD) 'ищем первый файл.
If hFnd = INVALID_HANDLE_VALUE Then Exit Sub
Do
Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) 'узнаём, является ли найденный файл папкой
If TrimNull(WFD.cFileName) <> "." And TrimNull(WFD.cFileName) <> ".." Then
If Atr > 0 Then 'если это папка
lstFiles.AddItem "[" & Path & TrimNull(WFD.cFileName) & "]" 'добавляем её в список найденных.
Else 'если это файл
lstFiles.AddItem Path & TrimNull(WFD.cFileName) 'добавляем его в список найденных.
End If
End If
Loop While FindNextFile(hFnd, WFD)
FindClose hFnd
End Sub

Теперь пробуем поиск - вызываем функцию SearchForFolders:

SearchForFolders ( "*.*", "c:\windows\", "*.txt";)

"*" - ищем во всех подкаталогах папки "c:\windows\" файлы с именем "*.txt".
Скачать прмер RecursiveSearch

разбирайся и учись кодить на более низком уровне

Ответить

Номер ответа: 55
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #55 Добавлено: 05.03.08 12:01
чувак, я так понял что для тебя скорость критична.

Как правило - да.

использование API дает двойной прирост производительности.

Я этого не говорил.

а ты говоришь, все это лажа.

Это верно.

вместо 10 минут, твой код будет работать 20 минут.

Вместо 10 минут "некий идеальный код который пока видел только один человек и который запускался только на одной единственной машине" мой код, "который я дал всем людям на свободное обозрение" будет работь 20 минут (в теории)


ты просто не знаешь, как это делать и пытаешься съехать!
Вот оно поколение программистов, взращенное на обертках

Брось
Я использовал Win32API когде еще когда никакого .NET и в планах не было.

Ладно меня достали твои наезды сейчас декомпильну твою мега-библиотеку и сообщу о результатах.

Ответить

Номер ответа: 56
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #56 Добавлено: 05.03.08 12:10
"Я использовал Win32API когде еще когда никакого .NET и в планах не было." это когда? когда ты еще в школе был:)))))))

Ответить

Номер ответа: 57
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #57 Добавлено: 05.03.08 12:36
да, именно когда был в школе

Ответить

Номер ответа: 58
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #58 Добавлено: 05.03.08 12:41
Imports System.Runtime.InteropServices

Public Class ReadFiles
    ' Methods
    <;DllImport("kernel32", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
    Private Shared Function FindClose(ByVal hFindFile As Integer) As Long
    End Function

    <;DllImport("kernel32", EntryPoint:="FindFirstFileA", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
    Private Shared Function FindFirstFile(<MarshalAs(UnmanagedType.VBByRefStr)> ByRef lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As Integer
    End Function

    <;DllImport("kernel32", EntryPoint:="FindNextFileA", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
    Private Shared Function FindNextFile(ByVal hFindFile As Integer, ByRef lpFindFileData As WIN32_FIND_DATA) As Integer
    End Function

    <;DllImport("kernel32", EntryPoint:="GetFileAttributesA", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
    Private Shared Function GetFileAttributes(<MarshalAs(UnmanagedType.VBByRefStr)> ByRef lpFileName As String) As Integer
    End Function

    Public Sub Read(ByVal Path As String)
        Me.SearchForFiles(Path)
    End Sub

    Private Sub SearchForFiles(ByVal Folder As String)
        ;Dim lpFindFileData As New WIN32_FIND_DATA
        If (Strings.Right(Folder, 1) <> "\";) Then
            Folder = (Folder & "\";)
        End If
        ;Dim hFindFile As Integer = ReadFiles.FindFirstFile(((Folder & "*.*";)), (lpFindFileData))
        If (hFindFile <> -1) Then
            ;Do While (ReadFiles.FindNextFile(hFindFile, (lpFindFileData)) > 0)
                ;Dim name As String
                If (Strings.InStr(lpFindFileData.Name, ChrW(0), CompareMethod.Binary) > 0) Then
                    name = Strings.Left(lpFindFileData.Name, (Strings.InStr(lpFindFileData.Name, ChrW(0), CompareMethod.Binary) - 1))
                Else
                    name = lpFindFileData.Name
                End If
                If Not ((name = ".";) Or (name = "..";)) Then
                    If ((lpFindFileData.Attributes And &H10) > 0) Then
                        Me.SearchForFiles((Folder & name))
                    Else
                        Me.Files.Add((Folder & name))
                    End If
                End If
            Loop
            ReadFiles.FindClose(hFindFile)
        End If
    End Sub


    ' Fields
    Private Const FILE_ATTRIBUTE_ARCHIVE As Short = &H20
    Private Const FILE_ATTRIBUTE_DIRECTORY As Short = &H10
    Private Const FILE_ATTRIBUTE_HIDDEN As Short = 2
    Private Const FILE_ATTRIBUTE_NORMAL As Short = &H80
    Private Const FILE_ATTRIBUTE_READONLY As Short = 1
    Private Const FILE_ATTRIBUTE_SYSTEM As Short = 4
    Private Const FILE_ATTRIBUTE_TEMPORARY As Short = &H100
    Public Files As List(Of String) = New List(Of String)
    Private Const INVALID_HANDLE_VALUE As Short = -1
    Private Const MAX_PATH As Short = 260
    Private Const MAXDWORD As Short = -1

    ' Nested Types
    <StructLayout(LayoutKind.Sequential)> _
    Private Structure FILETIME
        Public dwLowDateTime As Integer
        Public dwHighDateTime As Integer
    End Structure

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure WIN32_FIND_DATA
        Public Attributes As Integer
        Public CreationTime As FILETIME
        Public LastAccessTime As FILETIME
        Public LastWriteTime As FILETIME
        Public SizeHigh As Integer
        Public SizeLow As Integer
        Public Reserved0 As Integer
        Public Reserved1 As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
        Public Name As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=14)> _
        Public Alternate As String
    End Structure
End Class

этот код? Если нет, то не обижайся.

> EntryPoint:="FindFirstFileA", CharSet:=CharSet.Ansi
> EntryPoint:="FindNextFileA", CharSet:=CharSet.Ansi
> EntryPoint:="GetFileAttributesA", CharSet:=CharSet.Ansi
какая сказачная лажа

> Public Files As List(Of String) = New List(Of String)
Использование переменной уровня класса необосновано. И тем более смешно читать твое "код инкапсулирован чтоб блаблабла..." - я смогу его "завалить" даже без декомпиляции

По поводу наименования переменных почитай эти рекомендации - http://www.gotdotnet.ru/LearnDotNet/NETFramework/594.aspx

Ладно, я не бесплатный ревизор кода, перейдем непосредственно к тестированию.

Код был получен с помощью программы Reflector, был вставлен в тестовый проект.

Прогонял каждый кусок кода до тех пор пока вся ФС не закешируется (время доводил до минимального).
Программы собирались в режиме Relese.

Windows Server 2008 Enterprise x64, диск 400ГБ, 3 раздела.

Steel Brand:
        Dim start = Now
        Dim Files = LoadAllFiles()

        Console.WriteLine(Now.Subtract(start))
        Console.WriteLine("Найдено файлов: {0}", Files.Count)
        Console.ReadLine()


Result:
00:00:08.6420000
Найдено файлов: 312712


Результат.. не то чтоб непредсказуемый, аналогичный я получал на прошлых тестах.

Гуд, попробуем запустить твой код.
Поскольку твой код не способен сам перебирать буквы дисков, делаем несколько вызовов для каждого диска. Если где-то я написал неверные вызовы - укажи.

        Dim start = Now
        Dim ReadFiles As New ReadFiles
        For Each Drive In DriveInfo.GetDrives
            If Drive.DriveType = DriveType.Fixed Then
                ReadFiles.Read(Drive.RootDirectory.FullName)
            End If
        Next
        Dim Files = ReadFiles.Files


        Console.WriteLine(Now.Subtract(start))
        Console.WriteLine("Найдено файлов: {0}", Files.Count)

        Console.ReadLine()


Result:
00:00:00.0090000
Найдено файлов: 110


Скажем так, я ожидал что твой код будет выполняться гораздо бОльше времени чем показали реальные тесты.
К сожалению программа нашла не все файлы которые есть на моем компьютере поэтому сравнение времени выполнения делать необъективно.

Более объективным будет сравнение скорости работы в рассчете на единицу времени.
Steel Brand: 36185 файлов/сек
fluke: 12222 файлов/сек

то есть - в рассчете на единицу времени твой код находит в 3 раза меньше файлов чем мой.

Никакой инстурмент, даже самый быстрый, не дает право программисту писать откровенную ЛАЖУ.

За сим считаю вопрос решенным.

Ответить

Номер ответа: 59
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #59 Добавлено: 05.03.08 12:52
Кстати еще более интересно сравнить не время работы и не количество результатов а сами результаты.

Мой код находит:
C:\1.xml
C:\autoexec.bat
C:\bootmgr
C:\BOOTSECT.BAK
C:\config.sys
C:\inVHDDrvLog.dat
C:\IO.SYS
C:\msdia80.dll
C:\MSDOS.SYS
C:\pagefile.sys
C:\~$2.txt
C:\~$akarov.txt
C:\$Recycle.Bin\S-1-5-21-1613133395-4278240515-1316546919-500\$IRXVXXH.xlsb
C:\$Recycle.Bin\S-1-5-21-1613133395-4278240515-1316546919-500\$RRXVXXH.xlsb
C:\$Recycle.Bin\S-1-5-21-1613133395-4278240515-1316546919-500\desktop.ini
C:\$Recycle.Bin\S-1-5-21-2088595665-3436651255-2992290667-500\desktop.ini
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\mfc80u.dll
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\Microsoft.VC80.ATL.manife
st
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\Microsoft.VC80.CRT.manife
st
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\Microsoft.VC80.MFC.manife
st
..............
и тпт


Твой код находит:
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\


Не могу больше писать так как валяюсь под столом!

Ответить

Номер ответа: 60
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #60
Добавлено: 05.03.08 12:52
Забавненько.

Про именование переменных - с Brand'ом согласен. Меня тоже корёжить
начало, когда я увидел такие имена :)

Ответить

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

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



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