Массив на 99999999 элементов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 15:09

iGrok писал(а):
jangle писал(а):
iGrok писал(а):Видимо, дело в GDI...


Можно писать баг-репорт в Майкрософт?

Думаю, нет.
То, что ты делаешь - это крайне непродуктивный вывод на экран.
Никто и предполагать не мог, что кто-то будет пытаться сменить заголовок окна с такой частотой.


На самом деле это дыра в системе, по типу "смертельного MessageBox`a". Если я буду меня заголовок окна с высокой частотой, то накрою систему.
Этим могут воспользоваться вирусописатели

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Массив на 99999999 элементов

Сообщение iGrok » 08.02.2010 (Пн) 15:12

jangle писал(а):На самом деле это дыра в системе, по типу "смертельного MessageBox`a". Если я буду меня заголовок окна с высокой частотой, то накрою систему.
Этим могут воспользоваться вирусописатели

Что за бред?
У меня даже Ctrl-Shift-Esc работал, не говоря уже о Ctrl-Alt-Delete. И снять процесс было секундным делом.
Плохо реагировал только explorer. Т.е. таскбар и всё, что на нём.
label:
cli
jmp label

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 15:15

iGrok писал(а):
jangle писал(а):На самом деле это дыра в системе, по типу "смертельного MessageBox`a". Если я буду меня заголовок окна с высокой частотой, то накрою систему.
Этим могут воспользоваться вирусописатели

Что за бред?
У меня даже Ctrl-Shift-Esc работал, не говоря уже о Ctrl-Alt-Delete. И снять процесс было секундным делом.
Плохо реагировал только explorer. Т.е. таскбар и всё, что на нём.


У тебя какая версия сборки ОС, сервис паки? Возможно какая-то заплатка установлена, или наоборот не установлена. Поэтому у тебя система не умирает.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Массив на 99999999 элементов

Сообщение iGrok » 08.02.2010 (Пн) 15:18

jangle писал(а):У тебя какая версия сборки ОС, сервис паки? Возможно какая-то заплатка установлена, или наоборот не установлена. Поэтому у тебя система не умирает.

"Чистая" xp sp2. 2600 билд. Без дополнительных заплаток. Всего 1.8гига памяти. При запуске этой штуки остаётся метров 300 свободных.
label:
cli
jmp label

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 15:25

iGrok писал(а):
jangle писал(а):У тебя какая версия сборки ОС, сервис паки? Возможно какая-то заплатка установлена, или наоборот не установлена. Поэтому у тебя система не умирает.

"Чистая" xp sp2. 2600 билд. Без дополнительных заплаток. Всего 1.8гига памяти. При запуске этой штуки остаётся метров 300 свободных.


У меня XP SP3, включено автоматическое обновление. Так что последние версии заплаток должны быть установлены.

FFOX
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.02.2010 (Чт) 12:42

Re: Массив на 99999999 элементов

Сообщение FFOX » 08.02.2010 (Пн) 15:45

А давайте для начала озвучим базовую задачу?
Все таки нафига это делать? с таким массивом?
Чисто поржать? Или все таки есть какой-то физический смысл?
Может на задачу посмотрели узко, и сразу отбросили кучу вариантов решения?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 16:29

FFOX писал(а):А давайте для начала озвучим базовую задачу?
Все таки нафига это делать? с таким массивом?


Дискретный анализ. Распределения, математические ожидания, дисперсии и ковариации порядковых статистик и проч.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Массив на 99999999 элементов

Сообщение Хакер » 08.02.2010 (Пн) 16:35

Это не задачи, это набор словосочетаний.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 16:45

Хакер писал(а):Это не задачи, это набор словосочетаний.


Это область в которой лежит задача. Чисто практически мне необходимо сохранить 4 байта с индексом от 0 до 99999999. Где индекс является ключом к данным. И также выдать эти 4 байта, когда мне передают индекс. Например, по запросу 12992999, вернуть 4 байта из Arr(12992999).

FFOX
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.02.2010 (Чт) 12:42

Re: Массив на 99999999 элементов

Сообщение FFOX » 08.02.2010 (Пн) 16:46

jangle писал(а):
Дискретный анализ. Распределения, математические ожидания, дисперсии и ковариации порядковых статистик и проч.

А даннЫе где брать будете?
Статистические?
Строить по функциям?
Набивать руками?
инструмент для статистических задач из VB не очень, ИМХО...
может Вам(модераторы не сочтите за рекламу, просто совет...)
на SQL.Ru?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Массив на 99999999 элементов

Сообщение alibek » 08.02.2010 (Пн) 16:52

jangle писал(а):Чисто практически мне необходимо сохранить 4 байта с индексом от 0 до 99999999.

В таком случае Dim arr(0 To 99999999) As String*4 — не лучший способ решения такой задачи.
Чем тебя не устраивает сохранение в файл As Binary?
Lasciate ogni speranza, voi ch'entrate.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 16:54

FFOX писал(а):
jangle писал(а):
Дискретный анализ. Распределения, математические ожидания, дисперсии и ковариации порядковых статистик и проч.

А даннЫе где брать будете?
Статистические?
Строить по функциям?
Набивать руками?


Данные будем брать отсюда. Точнее с аппаратных датчиков. Объемы большие.

Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 16:58

alibek писал(а):Чем тебя не устраивает сохранение в файл As Binary?


Меня это устраивает! Устраивает все что приводит к решению задачи. Думаю просить готовый код у тебя бесполезно? :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Массив на 99999999 элементов

Сообщение alibek » 08.02.2010 (Пн) 17:01

jangle писал(а):Думаю просить готовый код у тебя бесполезно? :)

Нажатие F1 на операторах (statement) Get или Put даст справочную статью с примерами.
Lasciate ogni speranza, voi ch'entrate.

FFOX
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.02.2010 (Чт) 12:42

Re: Массив на 99999999 элементов

Сообщение FFOX » 08.02.2010 (Пн) 17:05

jangle писал(а):
Данные будем брать отсюда. Точнее с аппаратных датчиков. Объемы большие.


Тогда точно в сторону SQL надо смотреть
Это задача для него.
одно приложение пишет в базу данные,
другое получает из базы уже готовые, просчитанные и построенные выборки
Раз вы уже решили задачу получения данных с датчиков, то запихнуть их в базу не представляет никаких проблем
а SQL-server, уж поверьте, умеет работать с большими множествами, и работать хорошо и быстро.
Вам ведь для статистических расчетов нужна не динамика, насколько я понял, а статика за некоторый период.
Вобщем, не сужайте задачу, проанализируйте разные подходы и инструментарий.
Удачи!

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 17:20

FFOX писал(а):Тогда точно в сторону SQL надо смотреть
Это задача для него.
одно приложение пишет в базу данные,
другое получает из базы уже готовые, просчитанные и построенные выборки


Не думаю, что клиент согласится оплачивать еще и MS SQL Server или Oracle. Да это и не мое дело...
У меня конкретная задача из ТЗ, сохранить 4 байта и выдать их по запросу. Сделать это надо без БД и с минимальными
накладными расходами.

FFOX
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.02.2010 (Чт) 12:42

Re: Массив на 99999999 элементов

Сообщение FFOX » 08.02.2010 (Пн) 17:32

jangle писал(а):У меня конкретная задача из ТЗ, сохранить 4 байта и выдать их по запросу. Сделать это надо без БД и с минимальными
накладными расходами.

Не сохранить не 4 байта :)
а 99999999*4
плюс индекс
но, Вам виднее...
Тогда я должен согласится с alibek
делайте структуру, и сохраняйте As binary
но, все одно время поиска в бинарном файле будет тем больше, чем больше файл
особенно если вы будете прыгать из одного конца файла в другой.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Массив на 99999999 элементов

Сообщение iGrok » 08.02.2010 (Пн) 19:35

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

С чего вдруг? Ему не нужно искать ключ по значению. Только значение по ключу.
Зачем индекс? Просто обычный файл.
Хоть Open ... For Binary, хоть Open ... For Random, ибо длина записи известна.
И то и то обеспечит дОлжную скорость работы.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Массив на 99999999 элементов

Сообщение Хакер » 08.02.2010 (Пн) 19:40

jangle, и что, ты воздумал хранить 4 байта в 4-х символьной fixed-length юникодной строке? Да руки удалять надо за такое химическим методом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Массив на 99999999 элементов

Сообщение arthur2 » 08.02.2010 (Пн) 21:08

бр-р-р...
Я же уже выложил практически готовый код для бинарного файла, а вы ещё страницу после этого обсуждаете то же самое :D Чем мой вариант не устроил?
Артур
 
   

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Массив на 99999999 элементов

Сообщение Debugger » 08.02.2010 (Пн) 21:10

jangle, разве Dim a As String * 4 будет 4 байта занимать?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Массив на 99999999 элементов

Сообщение alibek » 08.02.2010 (Пн) 21:42

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

Не будет.
Те микросекунды, которые можно было бы выиграть на прямом чтении файла (в обход операционной системы), в VB все равно не получить.
Lasciate ogni speranza, voi ch'entrate.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 08.02.2010 (Пн) 22:56

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

С чего вдруг? Ему не нужно искать ключ по значению. Только значение по ключу.
Зачем индекс? Просто обычный файл.
Хоть Open ... For Binary, хоть Open ... For Random, ибо длина записи известна.
И то и то обеспечит дОлжную скорость работы.


Создал обычный файл на 99999999 записей, это заняло около 20 минут работы программы и 768 Мб на жестком диске.
Доступ к записям через MapViewOfFile мгновенный

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Массив на 99999999 элементов

Сообщение arthur2 » 08.02.2010 (Пн) 23:32

jangle писал(а):Создал обычный файл на 99999999 записей, это заняло около 20 минут работы программы и 768 Мб на жестком диске.
?4*99999999
Получаем 399999996 байт. Откуда у тебя почти в двое больше?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Массив на 99999999 элементов

Сообщение Хакер » 09.02.2010 (Вт) 0:06

И что, у тебя все 99999999 элементов всегда существуют и идут подряд?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Массив на 99999999 элементов

Сообщение MIT » 09.02.2010 (Вт) 0:36

jangle писал(а):Создал обычный файл на 99999999 записей, это заняло около 20 минут работы программы и 768 Мб на жестком диске.
20 минут — это чисто запись или время большое из-за особенностей источника данных (датчиков)? Если это именно запись, то, сдается мне, ты буфер забыл приделать.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

FFOX
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.02.2010 (Чт) 12:42

Re: Массив на 99999999 элементов

Сообщение FFOX » 09.02.2010 (Вт) 9:13

jangle писал(а):Создал обычный файл на 99999999 записей, это заняло около 20 минут работы программы и 768 Мб на жестком диске.
Доступ к записям через MapViewOfFile мгновенный

Хорошо, а как теперь это все дело обсчитывать?
Ну, например найти минимальное\максимальное значение?
Посчитать среднее?

И.т.д.
Или это другая задача?

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Массив на 99999999 элементов

Сообщение Денис » 09.02.2010 (Вт) 10:41

А может хранить элементы в таблице БД? Если неохота заморачиваться с БД и провайдерами, то можно банальный Open as Random задействовать.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Массив на 99999999 элементов

Сообщение jangle » 09.02.2010 (Вт) 12:22

arthur2 писал(а):
jangle писал(а):Создал обычный файл на 99999999 записей, это заняло около 20 минут работы программы и 768 Мб на жестком диске.
?4*99999999
Получаем 399999996 байт. Откуда у тебя почти в двое больше?


По 8 байт сделал каждую запись

Хакер писал(а):И что, у тебя все 99999999 элементов всегда существуют и идут подряд?


Сделал тестовый пример. В цикле сохраняем в файл все 99999999, а потом отображаем файл на массив, получая доступ к каждому элементу.
Чтобы все работало быстрее использовал PB:

Код: Выделить всё
#Compile Exe
#Dim All
#Optimize Speed
#Include "WIN32API.INC"
#If Not %Def (%INVALID_HANDLE_VALUE_LONG)
  %INVALID_HANDLE_VALUE_LONG = -1&
#EndIf

Function MapThisFile (szFileIn As Asciiz, hSys As Long, hFileMapping As Long, cbMapping As Long) As Dword
  Local w32 As WIN32_FIND_DATA, hSearch As Long
  Local pIFdata As Dword
  hSearch      = FindFirstFile (szFileIn, W32)
  If hSearch <> %INVALID_HANDLE_VALUE_LONG Then
      cbMapping    =  w32.nFileSizeLow
      CloseHandle     hSearch
  Else
      Function = 0
      Exit Function
  End If
  hSys = CreateFile (szFileIn, %GENERIC_READ, %FILE_SHARE_READ, ByVal %NULL, %OPEN_EXISTING, %FILE_ATTRIBUTE_NORMAL, ByVal %NULL)
  If IsTrue hSys  Then
     hFileMapping   = CreateFileMapping (hSys, ByVal %NULL, %PAGE_READONLY, ByVal %NULL, ByVal %NULL, ByVal %NULL)
     If IsTrue hFileMapping Then
         pIFData    = MapViewOfFile (hFileMapping, %FILE_MAP_READ, ByVal %NULL, ByVal %NULL, ByVal %NULL)
         Function   = pIFDATA
     Else
         Function    = 0
         Closehandle hSys
         Exit Function
     End If
  Else
      Function = 0
      Exit Function
  End If

End Function

Function UnmapMappedFile (pIfData As Dword, hSys As Long, hFileMapping As Long) As Long
    UnmapViewOfFile pIFData
    CloseHandle     hFileMapping
    CloseHandle     hSys
End Function

%RECORD_LENGTH  = 8

Function PBMain() As Long
Local pIFdata As Dword, hSys As Long, hFileMapping As Long, cbmapping As Long, szFile As Asciiz * %MAX_PATH
Local nRec    As Long, Reclen As Long
Local A()     As String * %RECORD_LENGTH
  szFile    =     "MMFTESTFILE.DAT"
  nRec      =     99999999
  RecLen    =     %RECORD_LENGTH
  Call            CreateTestFile (szFile, nRec, RecLen)
  pIfdata   =      MapThisFile (szFile, hSys, hFileMapping, cbmapping)
  ReDim            a (nRec -1) At pIFdata
  Call             CheckAFewEntries (A())
  UnMapmappedFile  pIFdata, hSys, hFileMapping
  MsgBox "Выход",%MB_IconInformation Or %MB_ApplModal, ""
End Function

Function CreateTestFile (szFile As Asciiz, nRec As Long, RecLen As Long) As Long
    Local hFile As Long, w As String, I As Long
    hFile = FreeFile
    Open    szFile For Random As hFile Len=RecLen
    For I  = 1 To nRec
        w  =   LSet$ (Using$(Str$(I), I), RecLen)
        Put #hFile, I, Abs w
    Next
    Close hFile
End Function

Function CheckaFewEntries (A() As String * %RECORD_LENGTH) As Long
    Local RecNo As Long, w As String, msg As String
    Do
         W = InputBox$("Nomer zapisi", "")
         If W = "" Then
             Exit Do
         Else
            W = Trim$(W)
            RecNo = Val(w) - 1
            If RecNo < LBound(A,1) Or RecNo > UBound(A,1) Then
                msg = "Ошибка выход за пределы массива!"
            Else
                msg = Trim$(A(RecNo))
            End If
            MsgBox Using$("Запись с индексом _# ###,### ==>'", RecNo+1) & msg & "'"
         End If
   Loop
End Function



20 минут — это чисто запись или время большое из-за особенностей источника данных (датчиков)? Если это именно запись, то, сдается мне, ты буфер забыл приделать


Просто запись файла без источника данных

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Массив на 99999999 элементов

Сообщение Хакер » 09.02.2010 (Вт) 12:39

Сделал тестовый пример. В цикле сохраняем в файл все 99999999, а потом отображаем файл на массив, получая доступ к каждому элементу.
Чтобы все работало быстрее использовал PB:

Меня интересует реальная задача, а не тестовый пример.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 42

    TopList  
cron