forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   случайная выборка файла (http://forum.boolean.name/showthread.php?t=13467)

L.D.M.T. 10.10.2010 10:32

случайная выборка файла
 
в общем проблема в следующем - имеется каталог текстур с кучей подкаталогов общим весом более 20 гигов. задача - нужно в случайном порядке брать текстуру и выводить ее на экран. возникает вопрос как лучше и грамотней это реализовать?

Randomize 10.10.2010 12:47

Ответ: случайная выборка файла
 
чтоб не вызывать затратную переборку всех файлов лучше предварительно сгенерить список (txt) и брать из него.

L.D.M.T. 10.10.2010 18:27

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

cyberblut 10.10.2010 18:38

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

impersonalis 10.10.2010 20:24

Ответ: случайная выборка файла
 
честно говоря, не понимаю проблемы - читаете имена файлов (можно рекурсивно по директориям, если вложенность не глубока), для каждого файла создаете экземпляр:
Код:

Type TFile
Field FileName$
End Type

Ну а со списком потом чего тольо нельзя сотворить.
Для удобства доступа, после завершения построения списка, можно сохранить элементы в массив Dim MyFiles.TFile(FileCount).
FileCount - инкрементальный счётчик, который куртился по мере четния директорий.
Код:

Delete Each tFILE
        Local D%=ReadDir(InputFolder)
        Local FileName$
        Local FullFileName$
        Local TotalC%=0
        While True
                FileName=NextFile(D)
                If FileName="" Exit
                FullFileName=InputFolder+"\"+FileName
                If FileType(FullFileName)=1
                        Local EXT3$,EXT4$
                        EXT4=Upper(Right(FileName,4))
                        EXT3=Upper(Right(FileName,3))
                        Local EXT$=""
                        If EXT3="BMP" Or EXT3="JPG" Or EXT3="PNG"
                                EXT=EXT3
                        ElseIf EXT4="JPEG"
                                EXT="JPG"
                        EndIf
                        If EXT<>""
                                Local F.tFILE=New tFILE
                                ;=
                                ;Set param-s
                                F\FullFileName=FullFileName
                                F\FileUEXT=EXT
                                F\ID=TotalC+1
                                ;=
                                TotalC=TotalC+1
                        EndIf
                EndIf
        Wend
        CloseDir(D)

Код:

Type tFILE
        Field FullFileName$
        Field FileUEXT$
        Field ID%
End Type

Код:

Dim LIST.tFILE(0)
Function tFILE2LIST(cnt%)
        Dim LIST(cnt)
        Local i=1
        For f.tFILE=Each tFILE
                LIST(i)=f
                i=i+1
        Next
End Function


L.D.M.T. 05.11.2010 22:51

Ответ: случайная выборка файла
 
Graphics 800,600,0,2
SetBuffer BackBuffer ()


Global sss=WriteFile ("spisok.txt")

oldTime=MilliSecs()

ScanDir("D:\tex\")
CloseFile sss

newTime=MilliSecs()

Print (Newtime-oldtime)/1000.0
WaitKey()
End


Function ScanDir(path$)
dir = ReadDir(path$)
Repeat
file$ = NextFile(dir)
If file$ = "" Then Exit
If file$ <> "." And file$ <> ".." Then
Select FileType(path$ + file$)
Case 1
WriteLine sss,path$ + file$
Case 2
ScanDir(path$ + file$ + "\")
End Select
EndIf
Forever
CloseDir dir
End Function



в общем я сделал так, результаты меня порадовали - 28 гигов за 7 секунд (хотя если написать библу на пурике, я думаю будет быстрее) и размер файла со списком получился почти 12 мегов.
осталась проблема, как сделать случайное чтение из списка не загружая весь файл в память?

cyberblut 06.11.2010 00:18

Ответ: случайная выборка файла
 
Генеришь число от 1 до КоличествоСтрок/записей и читаешь файл до нужной строки/записи построчно.


Часовой пояс GMT +4, время: 17:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot