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

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

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

Сообщение jangle » 07.02.2010 (Вс) 19:31

Код: Выделить всё
Dim Arr_Str(99999999) as String * 4


При работе программа сильно тормозит систему на ноутбуке. Возможно есть другие пути использования такого массива?

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

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

Сообщение alibek » 07.02.2010 (Вс) 19:34

Тебе не нужен такой массив.
Lasciate ogni speranza, voi ch'entrate.

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

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

Сообщение jangle » 07.02.2010 (Вс) 19:36

alibek писал(а):Тебе не нужен такой массив.


Возможно и так. Но а конкретный совет будет?

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

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

Сообщение jangle » 07.02.2010 (Вс) 19:52

Допустим это не массив, а некий "черный ящик", который может сохранять 4 байта в одной из 99999999 ячеек своей памяти. Какие пути к созданию такого объекта? Возможно его стоит хранить в виде оверлейного файла или что-то подобное?

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

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

Сообщение MIT » 07.02.2010 (Вс) 19:56

Вариант со словарем не подойдет?
Мы храним только индекс, по которому что-то есть, в качестве ключа и информацию в качестве значения. Т.е. dict(23513453) - не равно ничему, а, например, в dict(98684) лежат данные.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

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

Сообщение Debugger » 07.02.2010 (Вс) 20:00

jangle писал(а):
Код: Выделить всё
Dim Arr_Str(99999999) as String * 4


При работе программа сильно тормозит систему на ноутбуке. Возможно есть другие пути использования такого массива?

Можно использовать файл в качестве массива. Быстрее или медленнее будет - не знаю.

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

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

Сообщение MIT » 07.02.2010 (Вс) 20:02

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

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

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

Сообщение jangle » 07.02.2010 (Вс) 20:05

MIT писал(а):Вариант со словарем не подойдет?
Мы храним только индекс, по которому что-то есть, в качестве ключа и информацию в качестве значения. Т.е. dict(23513453) - не равно ничему, а, например, в dict(98684) лежат данные.


Мне индекс хранить не нужно. Для меня он ключ, по которому лежат нужные 4 байта.

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

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

Сообщение MIT » 07.02.2010 (Вс) 20:07

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

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

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

Сообщение jangle » 07.02.2010 (Вс) 20:09

Debugger писал(а):Можно использовать файл в качестве массива. Быстрее или медленнее будет - не знаю.


Будет медленнее, надо продумать механизм навигации по такому огромному файлу

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

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

Сообщение jangle » 07.02.2010 (Вс) 20:09

MIT писал(а):
jangle писал(а):Мне индекс хранить не нужно.
Да он какбэ нигде и не хранится. Этот индекс-ключ будет тобой использоваться для вытаскивания из словаря значения.


Можешь привести пример такого словаря? Исходники?

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

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

Сообщение MIT » 07.02.2010 (Вс) 20:21

Не очень элегантно, конечно, но смысл, думаю, донести получилось:
Код: Выделить всё
Public c As Collection

Private Sub Form_Load()
    Set c = New Collection
    Dim indx As Long
    indx = CLng(Rnd * 1000000)
    c.Add "1234", CStr(indx)
   
    On Error Resume Next
    Dim v1 As String, v2 As String
    v1 = c(CStr(4444))
    v2 = c(CStr(indx))
    Stop
End Sub

И, да, не словарь, а коллекция... Словари — это в .NET`е.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

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

Сообщение jangle » 07.02.2010 (Вс) 21:56

MIT писал(а):Не очень элегантно, конечно, но смысл, думаю, донести получилось:
Код: Выделить всё
Public c As Collection

Private Sub Form_Load()
    Set c = New Collection
    Dim indx As Long
    indx = CLng(Rnd * 1000000)
    c.Add "1234", CStr(indx)
   
    On Error Resume Next
    Dim v1 As String, v2 As String
    v1 = c(CStr(4444))
    v2 = c(CStr(indx))
    Stop
End Sub

И, да, не словарь, а коллекция... Словари — это в .NET`е.


После 2-3 миллионов записей программа умерла, утянув за собой и ОС, пришлось ресетится. И это при 3 гигах оперативки

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

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

Сообщение arthur2 » 07.02.2010 (Вс) 21:57

Может, так?
Код: Выделить всё
Public Property Get Arr_Str(ByVal index As Long) As String
  Arr_Str = Space(4)
  Get #f, index * 4 + 1, Arr_Str
End Property

Public Property Let Arr_Str(ByVal index As Long, newVal As String)
  Put #f, index * 4 + 1, newVal
End Property


А при каком количестве элементов массив не тормозит? Может сделать аналогично свойством, а хранить элементы в нескольких массивам помельче? Типа:

Код: Выделить всё
Dim mArr1(0 To 49999999) As String * 4
Dim mArr2(50000000 To 99999999) As String * 4

Public Property Get Arr_Str(ByVal index As Long) As String
  If index >= 50000000 Then
     Arr_Str = mArr1(index)
  Else
     Arr_Str = mArr2(index)
  End If
End Property

Public Property Let Arr_Str(ByVal index As Long, newVal As String)
  If index >= 50000000 Then
     mArr1(index) = newVal
  Else
     mArr2(index) = newVal
  End If
End Property
Последний раз редактировалось arthur2 07.02.2010 (Вс) 22:13, всего редактировалось 2 раз(а).
Артур
 
   

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

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

Сообщение Хакер » 07.02.2010 (Вс) 22:00

Правильным ответом был второй пост.

. Словари — это в .NET`е.

Словари — это и в земном программировании, а не только в «божественном» .NET. Например Scripting.Dictionary — словарь от FSO.
—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 » 07.02.2010 (Вс) 22:36

Хакер писал(а):Словари — это и в земном программировании, а не только в «божественном» .NET.
Вот обязательно надо прицепится к .NET`у, это типа круто, да?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

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

Сообщение Хакер » 07.02.2010 (Вс) 22:38

Безусловно. И когда я это делаю, я всегда надеваю черные очки (даже ночью), чтобы преумножить на порядок ощущение собственной крутости...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

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

Сообщение iGrok » 07.02.2010 (Вс) 22:41

jangle писал(а):При работе программа сильно тормозит систему на ноутбуке.

Ещё бы она не тормозила. 800 метров памяти "сожрать" при запуске..

MIT, что-то у тебя самого какая-то болезненная реакция на слово ".NET".

А по теме, с такими размерами, думаю, всё-таки нужно использовать спроецированный в память файл.
Или вообще просто обычный файл.
label:
cli
jmp label

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

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

Сообщение MIT » 07.02.2010 (Вс) 22:47

iGrok писал(а):MIT, что-то у тебя самого какая-то болезненная реакция на слово ".NET".
Не на слово ".NET", а на бессмысленные/необоснованные/глупые отрицательные выкрики в сторону данной технологии.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

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

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

Сообщение jangle » 07.02.2010 (Вс) 22:59

Код: Выделить всё
Option Explicit

Dim Arr(0 To 99999999) As Long
Private Sub Command1_Click()
Dim i As Long
For i = 1 To 99999999
Arr(i) = i
Me.Caption = i
DoEvents
Next i
End Sub


После миллиона итераций XP сходит с ума, система теряет стабильность. Отказывает эксплорер и диспечер задач. Возможно это потому, что у меня отключен файл подкачки. Cтранно, что отваливается возможность переключения раскладки клавиатуры. Вот тебе и "надежная" операционная система!
Последний раз редактировалось jangle 07.02.2010 (Вс) 23:15, всего редактировалось 1 раз.

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

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

Сообщение jangle » 07.02.2010 (Вс) 23:06

arthur2 - с файлом это видимо самое правильное решение. В оперативке с такими объемами не развернутся

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

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

Сообщение arthur2 » 07.02.2010 (Вс) 23:17

Кстати, так, пожалуй, чуть быстрее:
Код: Выделить всё
Public Property Get Arr_Str(ByVal index As Long) As String
  Static s As String * 4
  Get #f, index * 4 + 1, s
  Arr_Str = s
End Property
Артур
 
   

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

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

Сообщение FaKk2 » 08.02.2010 (Пн) 4:13

jangle писал(а):Возможно это потому, что у меня отключен файл подкачки. Cтранно, что отваливается возможность переключения раскладки клавиатуры. Вот тебе и "надежная" операционная система!


jangle, вот запереть тебя в ванной, запереть двери/окна и включить воду. Я уверен что когда вода достигнет потолка ты будешь задыхаться и вообще вести себя странно. Вот тебе и "надежный" человек!
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

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

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

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

FaKk2 писал(а):jangle, вот запереть тебя в ванной, запереть двери/окна и включить воду. Я уверен что когда вода достигнет потолка ты будешь задыхаться и вообще вести себя странно. Вот тебе и "надежный" человек!


Операционная система не должна сходить с ума, от процесса который забирает 200 мегабайт оперативки, при 3 Гигах установленной памяти.

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

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

Сообщение alibek » 08.02.2010 (Пн) 12:49

jangle писал(а):от процесса который забирает 200 мегабайт оперативки

И как ты это посчитал?
Lasciate ogni speranza, voi ch'entrate.

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

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

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

alibek писал(а):
jangle писал(а):от процесса который забирает 200 мегабайт оперативки

И как ты это посчитал?


В таскменеджере посмотрел

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

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

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

И ты не подумал, куда делись остальные 800Мб?
Lasciate ogni speranza, voi ch'entrate.

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

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

Сообщение iGrok » 08.02.2010 (Пн) 14:39

jangle писал(а):В таскменеджере посмотрел

Это несколько странно, т.к. у меня тот же код жрёт 400Мб.
При этом эксплорер и остальное отказывает только если изменения отображаются в Caption.
Т.е. вот такой вариант при выключении отображения изменений в Caption окна систему не грузит вообще. Хотя и отжирает те же 400Мб.
Видимо, дело в GDI...
Код: Выделить всё
Option Explicit

Dim Arr(0 To 99999999) As Long
Dim bWrk As Boolean

Private Sub Check1_Click()
    bWrk = IIf(Check1.Value = vbChecked, True, False)
End Sub

Private Sub Command1_Click()
    bWrk = True
    Dim i As Long
    Do While i < 99999999
        If bWrk Then
            Me.Caption = i
        End If
        Arr(i) = i
        i = i + 1
        DoEvents
    Loop
End Sub


alibek писал(а):И ты не подумал, куда делись остальные 800Мб?

А куда они могли деться, если у него своп отключен?
label:
cli
jmp label

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

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

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

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


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

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

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

Сообщение iGrok » 08.02.2010 (Пн) 14:57

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


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

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

Вот так работает без проблем и тормозов:
Жрёт те же 400Мб + на моей машине 50% проца.
Код: Выделить всё
Option Explicit

Dim Arr(0 To 99999999) As Long

Private Sub Command1_Click()
Dim t0 As Single
    Dim i As Long
    Do While i < 99999999
        If Timer > t0 + 0.1 Then
            Me.Caption = i
            t0 = Timer
        End If
        Arr(i) = i
        i = i + 1
        DoEvents
    Loop
End Sub
label:
cli
jmp label

След.

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

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

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

    TopList