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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

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

Сообщение Antonariy » 09.02.2010 (Вт) 14:27

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


Просто запись файла без источника данных
У меня получилось 48 секунд включая генерацию данных. Запись файла — секунд 5. Из-под VBA.
Код: Выделить всё
Dim r() As Byte
    t = Now
    ReDim r(399999996)
    For x = 0 To 399999996
        r(x) = Rnd * 255
    Next
    WriteFile "c:\1.0", r
    Debug.Print DateDiff("s", Now, t)

Public Sub WriteFile(path As String, r() As Byte)
    Open path For Binary As #1
    Put #1, , r
    Close #1
End Sub
Лучший способ понять что-то самому — объяснить это другому.

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

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

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

Antonariy писал(а):У меня получилось 48 секунд включая генерацию данных. Запись файла — секунд 5. Из-под VBA.


Прошу огласить конфигурацию машины. У меня на P-4 (3GHz), 512 DDR2 и с 2 Гб файлом подкачки выполнение вышеприведенного кода висело около 3 минут (причем всё это время winword.exe занимал в памяти 20-22 Мб), после чего мне надоело ждать и я брейкнул.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

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

Сообщение ANDLL » 09.02.2010 (Вт) 14:58

Гы.
Вот я читаю топик и не могу... удержаться в смысле не могу.
Это ж надо...

Чтобы все работало быстрее использовал PB:
Забавно даже то, что если бы код жунгла был написан на C, а код Antonariy на JavaScript, то он(код по типу Antonariy) все равно работал бы быстрее в много раз(если конечно там не комп вроде Денисовского). Что еще раз подтверждает очень старую истину - нужно писать программы используя мозги, а не (что там жунгле использует)

У меня на P-4 (3GHz), 512 DDR2 и с 2 Гб файлом подкачки выполнение вышеприведенного кода висело около 3 минут, после чего мне надоело ждать и я брейкнул.
До тебя не доходит что массив просто тупо сливается в своп и это не ускоряет процесс записи?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

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

Сообщение ANDLL » 09.02.2010 (Вт) 15:06

Алсо мне нравится как люди стремятся использовать "оверлейного файла"(судя по дальнейшему топику это мемори мапед фаел). Я конечно спросил бы что общего у MMF и оверлеев, но уж наверное это будет слишком жестоко. Но все же - куча народу и правда ведь верит в магию MMF, полагая что это какаято чудесная фича, которая может ускорить чтение файлов с диска. Спешу разочаровать - правильно использованный ReadFile для одноразового чтения ничуть не лучше и не хуже MMF.
А можно я еще напишу парку комментоф в таком же стиле?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

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

Сообщение MIT » 09.02.2010 (Вт) 15:11

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

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

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

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

ANDLL писал(а):Гы. До тебя не доходит что массив просто тупо сливается в своп и это не ускоряет процесс записи?


Гы. У меня диспетчер задач тупо показывает что winword.exe все три минуты тупо занимал в памяти 20-22 Мб. Поэтому я сделал вывод, что winword.exe тупо использовал 20-22 Мб памяти и не больше.

А где посмотреть реальные данные?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

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

Сообщение ANDLL » 09.02.2010 (Вт) 15:25

Ну короче 399999996 байт это 381,469722747802734375 метров, что конечно скорее всего при 512 метрах памяти будет в существенной мере засунуто в файл подкачки.
Отчего да почему диспетчер задач показывает меньше - я не могу сказать. Посмотри счетчик page fault'ов - он должен зашкаливать.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

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

Сообщение Antonariy » 09.02.2010 (Вт) 15:26

Денис писал(а):
Antonariy писал(а):У меня получилось 48 секунд включая генерацию данных. Запись файла — секунд 5. Из-под VBA.


Прошу огласить конфигурацию машины.
Core2 Duo E6750 @ 2,66 GHz, 2ГБ ОЗУ.
Лучший способ понять что-то самому — объяснить это другому.

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

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

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

Мой код не использует массив в оперативной памяти, а сразу пишет байты в открытый файл. В конце цикла файл закрывает. Но я код выкладывать не стал, ибо во-первых предложенных решений уже много, во-вторых, мой код работает невыносимо долго, он и 30 Мб создает долго, а уж 300, а уж требуемый автору гиг и подавно.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

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

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

Сообщение jangle » 09.02.2010 (Вт) 16:29

Хакер писал(а):Меня интересует реальная задача, а не тестовый пример.


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

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

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

Сообщение jangle » 09.02.2010 (Вт) 16:38

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


Просто запись файла без источника данных
У меня получилось 48 секунд включая генерацию данных. Запись файла — секунд 5. Из-под VBA.
Код: Выделить всё
Dim r() As Byte
    t = Now
    ReDim r(399999996)
    For x = 0 To 399999996
        r(x) = Rnd * 255
    Next
    WriteFile "c:\1.0", r
    Debug.Print DateDiff("s", Now, t)

Public Sub WriteFile(path As String, r() As Byte)
    Open path For Binary As #1
    Put #1, , r
    Close #1
End Sub


Этот код - глупость. Прочитай про условия задачи.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

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

Сообщение Antonariy » 09.02.2010 (Вт) 17:28

Повторю, если до сих пор не дошло: глупость — держать 4 байта в строке. Байты выгоднее хранить, не поверишь, в байтовом массиве. И писать как байтовый массив. Способ с записью сразу в файл поэлементно будет быстрее лишь при ограниченном количестве оперативки. И то не факт, работа с файлом подкачки наверняка оптимизирована на уровне ядра, копирование данных из него в новый файл самой системой почти наверняка будет быстрее, чем задрочка Put в цикле.
Лучший способ понять что-то самому — объяснить это другому.

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

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

Сообщение iGrok » 09.02.2010 (Вт) 18:07

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

Antonariy:
Я так понял, что ему не нужна возможность писать/читать весь набор за раз. Ему нужна возможность произвольно писать/читать некоторые ячейки.
Соответственно, большого смысла отжирать 400 метров в памяти под это дело нет.

Впрочем, если я понял не правильно, и ему нужно читать/писать весь массив, тогда конечно в память его надо грузить массивом а не поэлементно.

jangle, за кой чёрт у тебя 8 байт на запись, если ты сохраняешь всего по 4 байта данных?
label:
cli
jmp label

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

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

Сообщение jangle » 09.02.2010 (Вт) 18:14

Antonariy писал(а):Повторю, если до сих пор не дошло: глупость — держать 4 байта в строке. Байты выгоднее хранить, не поверишь, в байтовом массиве. И писать как байтовый массив.


Правильно думаешь - не поверю тебе. Потому что килограмм железа весит ровно столько, сколько и килограмм пуха. Утверждать обратное и есть - глупость :D
Ниже пример, показывает сколько занимает байтовый и стринговый массивы в памяти.

Код: Выделить всё
#Compile Exe
#Dim All

Function PBMain () As Long
    Dim ArrStr   (0 To 99999999)  As String * 4
    Dim ArrByte  (0 To 399999996) As Byte
   
    ArrStr(0)="x"
    ArrStr(99999999)="y"

    ArrByte(0)=1
    ArrByte(399999996)=255
   
    Print "Размер блока памяти в строковом массиве: " ;   VarPtr(ArrStr(99999999))-   VarPtr(ArrStr (0))
    Print "Размер блока в байтовом массиве:         " ;   VarPtr(ArrByte(399999996))- VarPtr(ArrByte(0))

    WaitKey$
End Function


Результат:
Изображение

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

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

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

jangle, эта тема существует в разделе о VB. Кого интересуют кривые особенности PB?
—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 » 09.02.2010 (Вт) 18:27

Хакер писал(а):jangle, эта тема существует в разделе о VB. Кого интересуют кривые особенности PB?


Ты хочешь сказать, что в VB результат будет отличаться? Возможно, но сомнительно.. :)
Хочешь примеры на C++/Delphi где результат будет такой же как у меня?
И какой язык после этого кривой?

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

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

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

PB кривой, потому что в его стринги не поместить ни юникод, ни 0-содержащую строку.

Раздел о VB. Обсуждался этот язык. Обсуждался код на этом языке. Обсуждалось хранение 4-байтовых последовательностей в строках или байтовых массивах в рамках языка. Antonariy тебе сказал правильную вещь.

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

Пред.

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

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

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

    TopList  
cron