purebasic.info

PureBasic forum
Текущее время: Чт апр 26, 2018 10:33 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Как правильно хранить данные?
СообщениеДобавлено: Сб авг 05, 2017 11:32 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте!
Ситуация такова:
Имеется некий объём неизменяемой информации.
Примерно 600 000 значений (чисел)
Причём эта информация имеет очень простую форму - бинарную, то есть по сути это 600 000 ноликов и единичек. (ну или TRUE - FLASE.....1-2 не суть важно, главное 1 бит)
Программа с момента получения этой информации не меняет в ней ни одной циферки - ни одного битика, но зато часто (точнее постоянно) обращается к ней (считывает значения тех или иных элементов)
Какой выбрать способ хранения информации для того, чтобы скорость обращения к ней была максимальной?
Массив?
Список?
Прямая запись в память?
Что будет считываться максимально быстро???
Заранее Спасибо!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вс авг 06, 2017 7:03 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6246
Благодарил (а): 17 раз.
Поблагодарили: 182 раз.
Пункты репутации: 48
если статически, то DataSection
И если не принципиально, то лучше не связываться с битами, а оперировать байтами - 600000 байт это очень маленький объем информации по современным меркам, будет обрабатываться мгновенно.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вс авг 06, 2017 7:36 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
И если не принципиально, то лучше не связываться с битами
не принципиально, тем более при таком объёме сокращение потребляемой памяти не существенно, относительно вероятных затрат ресурсов на перевод из байтов и биты и обратно.
Про биты я к слову написал, дабы подчеркнуть, что большого объёма на хранение данных не требуется.(числа маленькие)
600000 байт это очень маленький объем информации по современным меркам
Знаю, но всегда стараюсь оптимизировать до предела - привычка, да и отношение к коду (программа должна потреблять минимум ресурсов при максимально возможной скорости - раскидываться ресурсами машины просто потому, что их много не по мне.
если статически, то DataSection
Да, статически после первого же заполнения, т.е, допустим, считали данные из файла и всё более они не меняются, но зато к ним идёт постоянное обращение.
Но первый раз они всё же заносятся в программу (не ручками, а опять же, допустим, из файла)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вс авг 06, 2017 8:16 am 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 143
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Селекин Сергей писал(а):
Но первый раз они всё же заносятся в программу (не ручками, а опять же, допустим, из файла)

DataSection
Label:
IncludeBinary "file.data"
EndDataSection


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вс авг 06, 2017 8:43 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
КЭС писал(а):
Селекин Сергей писал(а):
Но первый раз они всё же заносятся в программу (не ручками, а опять же, допустим, из файла)

DataSection
Label:
IncludeBinary "file.data"
EndDataSection


Два вопроса:
1.
Код:
1
Label:

Разве это не метка строки для подпрограммы?

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

Сейчас попробую объяснить, что именно я имею ввиду....

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim g.b(600000)
If ReadFile(0, "file.data")  
  While Eof(0) = 0          
        A$=ReadString(0)      
    If a$="D"
      g(i)=1
    EndIf
    i=i+1  
    Wend
    CloseFile(0)              
  Else
    MessageRequester("Information","Couldn't open the file!")
  EndIf
 



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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вс авг 06, 2017 8:54 am 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 143
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Да, с DataSection - это мимо кассы.

Если уж и считывать данные из файла, то никак не ReadString(), а использовать ReadData().

Label: - это адрес в программе. Как его использовать - дело программиста. Можно выполнить инструкции с этого адреса, а можно использовать данные (там может быть что угодно: текст, картинка, музыка и т.д.).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вс авг 06, 2017 10:19 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6246
Благодарил (а): 17 раз.
Поблагодарили: 182 раз.
Пункты репутации: 48
Если данные в массиве, то Data секция точно не нужна. Из массива данные достать так же быстро и даже проще.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вс авг 06, 2017 10:22 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 567
Благодарил (а): 2 раз.
Поблагодарили: 31 раз.
Пункты репутации: 9
Если будешь работать с байтоми как с единицей информации то и хранить в файле нужно этот объём данных для того что бы при загрузки в память программы не преобразовывать из битов в байты.
Дальше грузишь байты в массив и работаешь с ним или грузишь в память и работаешь типа peekb(),
если работать с битами то грузишь данные в память и работаешь с каждым битом по его индексу. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Пн авг 07, 2017 7:44 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ещё один вопрос....
Как пользоваться DataSection, точнее, как получить записанные туда данные?
Код:
1
2
3
4
DataSection
Label:
IncludeBinary "file.data"
EndDataSection


Данные считанны....
А дальше?
С массивом всё понятно
Код:
1
Number=a(n)

получили значение элемента массива номер n
А тут как???


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Пн авг 07, 2017 8:20 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Провёл эксперимент - результат меня шокировал!!!
Может я жутко глючу, НО....
Результаты показывают, что чтение из массива происходит быстрее, чем прямое чтение из памяти...
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Dim a(10)
For i=0 To 10
  a(i)=i
Next i
 
Start = GetTickCount_()
For i=0 To 10000000
  If x>10
    x=0
  EndIf
    b=a(x)
  Next i
 
Ende = GetTickCount_();    



и

Код:
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
n.b=0
*MemoryID = AllocateMemory(11)
If *MemoryID
    ; В цикле производится запись в память
    For i=0 To 10
      If n=0
        n=1
      Else
        n=0
        EndIf
      PokeC(*MemoryID+i, n)
    Next i
   
  Start = GetTickCount_()  
            For i=0 To 10000000
  If x>10
    x=0
  EndIf
       a=PeekC(*MemoryID+x)
   Next i
   
   Ende = GetTickCount_();
 
Debug "Time = " + Str(Ende - Start)
   FreeMemory(*MemoryID)
 EndIf



Кто может поясните, ПОЖАЛУЙСТА!!!

Насколько я знаю, правда по другим языкам обращение к массиву)в том числе и чтение из него) сильно замедляет выполнение программы... (по крайней мере в том же самом VB,NET это так.)
Поясните кто может.....
Как это может быть, кто считать из массива быстрее чем из памяти???? :shock:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Пн авг 07, 2017 8:21 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Код:
1
Number=PeekA(?Label+n)

Или
Код:
1
2
3
4
5
6
7
Structure x
  x.a[0]
EndStructure
 
*x.x=?Label
 
Number=*x\x[n]


Селекин Сергей писал(а):
Результаты показывают, что чтение из массива происходит быстрее, чем прямое чтение из памяти
На моем компе время одинаковое.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Пн авг 07, 2017 8:39 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Селекин Сергей писал(а):
Результаты показывают, что чтение из массива происходит быстрее, чем прямое чтение из памяти
На моем компе время одинаковое.

Возможно у меня тоже отличия относительно небольшие (около 10%)
Но даже если одинаковые ....
разве массив не замедляет машину?
Или на PureBasic этого эффекта просто нет?
Я эту тему открыл именно руководствуясь прошлым опытом на VB.NET
Там даже рекомендуется если к элементом массива совершается много вычислительных операций(не запись в массив а просто частые обращения к элементу массива) приравнивать его к обычной переменной и уже с ней производить расчеты.
Или, например, если надо сравнить, допустим первый элемент массива со всеми остальными, некую простую переменную надо приравнять к первому элементу массива и производить сравнения уже этой переменной с остальными ячейками...
Это, конечно не обязательно, но код ускоряет....т.е. чем чаще дергаешь элементы массива(даже для чтения) тем замедление программа


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Пн авг 07, 2017 10:54 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6246
Благодарил (а): 17 раз.
Поблагодарили: 182 раз.
Пункты репутации: 48
Массив та же память по сути. Выше уже писал, что практически скорость та же.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Пн авг 07, 2017 11:47 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 133
Откуда: Україна
Благодарил (а): 7 раз.
Поблагодарили: 10 раз.
Пункты репутации: 4
У меня на таких примерах результаты в двое отличаются, где я накосячил? (ага, уже увидел, на чтении тормозит.)

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
file$ = OpenFileRequester("Select a file","","All files (*.*)|*.*",0)
If file$
  If ReadFile(0, file$, #PB_File_SharedRead)
    StartRead = GetTickCount_()
    length = Lof(0)
    *MemoryID = AllocateMemory(length)
    If *MemoryID
      bytes = ReadData(0, *MemoryID, length)
      CloseFile(0)
      EndRead = GetTickCount_()
      Debug "Time 1 = " + Str(EndRead - StartRead)
      StartRead = GetTickCount_()
     
      For k = 0 To length
        tmp = PeekA(*MemoryID+k)
      Next
      Debug "Byte from 0x400: " + Str(PeekA(*MemoryID+1024))
      EndRead = GetTickCount_()
      Debug "Time 2 = " + Str(EndRead - StartRead)
    EndIf
   
  EndIf
EndIf



Код:
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
Structure ArrayDB
  x.a
EndStructure
 
file$ = OpenFileRequester("Select a file","","All files (*.*)|*.*",0)
If file$
  If ReadFile(0, file$, #PB_File_SharedRead)
    StartRead = GetTickCount_()
    length = Lof(0)
    Dim ArrayDB(length)
    For a = 0 To length
      ReadData(0, @ArrayDB(a), SizeOf(ArrayDB))
    Next
    CloseFile(0)
    EndRead = GetTickCount_()
    Debug "Time 1 = " + Str(EndRead - StartRead)
    StartRead = GetTickCount_()
    For k = 0 To length
      tmp = ArrayDB(k)
    Next
    Debug "Byte from 0x400: " + Str(ArrayDB(1024))
    EndRead = GetTickCount_()
    Debug "Time 2 = " + Str(EndRead - StartRead)
  EndIf
EndIf
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как правильно хранить данные?
СообщениеДобавлено: Вт авг 08, 2017 1:29 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 567
Благодарил (а): 2 раз.
Поблагодарили: 31 раз.
Пункты репутации: 9
Селекин Сергей писал(а):
Провёл эксперимент - результат меня шокировал!!!
Может я жутко глючу, НО....
Результаты показывают, что чтение из массива происходит быстрее, чем прямое чтение из памяти...
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Dim a(10)
For i=0 To 10
  a(i)=i
Next i
 
Start = GetTickCount_()
For i=0 To 10000000
  If x>10
    x=0
  EndIf
    b=a(x)
  Next i
 
Ende = GetTickCount_();    



и

Код:
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
n.b=0
*MemoryID = AllocateMemory(11)
If *MemoryID
    ; В цикле производится запись в память
    For i=0 To 10
      If n=0
        n=1
      Else
        n=0
        EndIf
      PokeC(*MemoryID+i, n)
    Next i
   
  Start = GetTickCount_()  
            For i=0 To 10000000
  If x>10
    x=0
  EndIf
       a=PeekC(*MemoryID+x)
   Next i
   
   Ende = GetTickCount_();
 
Debug "Time = " + Str(Ende - Start)
   FreeMemory(*MemoryID)
 EndIf



Кто может поясните, ПОЖАЛУЙСТА!!!

Насколько я знаю, правда по другим языкам обращение к массиву)в том числе и чтение из него) сильно замедляет выполнение программы... (по крайней мере в том же самом VB,NET это так.)
Поясните кто может.....
Как это может быть, кто считать из массива быстрее чем из памяти???? :shock:

Потому как алгоритм братия числа из памяти идёт через процедуру а это трата лишних ресурсов :D
А при обращении к индексу массива может быть другой алгоритм.
Изучай для таких случаев асм и будешь понимать....
Вот пример как один из вариантов тебе :roll:
Код:
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
42
43
44
45
46
47
48
49
50
51
 
Global n.a
Global i.i
Global a.a
 
*MemoryID = AllocateMemory(10000001)
If *MemoryID
    ; В цикле производится запись в память
    For i=*MemoryID To *MemoryID+10000000 Step 1
     
      If n=256
        n=0
      EndIf
      PokeA(i,n)
       n+1
    Next i
EndIf
   
 
 
 
 
   
   MessageRequester("", "Начало теста с начального адреса памяти="+ *MemoryID + #CR$  )
   time = GetTickCount_()
   For i=*MemoryID To *MemoryID+10000000 Step 2;извлекаем из памяти сразу 2 байта
 
     
    ;a=PeekA(i);теперь выводим без процедуры Step 1
     !mov dword eax,[v_i];пишем адрес в регистр процессора
     !mov  dword eax,[eax];берём данные с этого адреса памяти в регистор процессора
     !mov byte[v_a],al;помещаем 1 байт в переменную из которой после присваеваем куда нужно или просто выводим на экран
      ;...........
      !mov byte[v_a],ah;помещаем 2 байт в переменную из которой после присваеваем куда нужно или просто выводим на экран
      ;....................
      ;===================для примера ,посмотреть данные с маленьким циклом
      ;!PUSHAd
      ;Debug a
      ;!POPAd
     ;====================
      Next
 
   
     
     
     
   t.d = (GetTickCount_() - time)/1000
   i-*MemoryID
   MessageRequester("", "Количество  циклов="+ i + #CR$ + "Время теста= " + t)
   FreeMemory(*MemoryID)
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB