Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Как грамотно сохранить массив? Добавлено: 11.06.06 10:54  

Автор вопроса:  dr.Faust
Есть байтовый массив 8х1000000, ну или где-то около того. Как его лучше сохранить в файл. Не в текстовой же побайтно загонять?

Ответить

  Ответы Всего ответов: 19  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 11.06.06 15:32
Можешь попробовать записать 80000000 байт с адреса varptr(arr(0,0)) в файл, например, с помощью WriteFile

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 11.06.06 22:45
сериализуй его и не мучайся...

Ответить

Номер ответа: 3
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 11.06.06 22:47
А с VarPtr даже не пытайся.. в .НЕТ эта инструкция больше не поддерживается...

Ответить

Номер ответа: 4
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 12.06.06 12:00
Ну тогда только в текстовый побайтно :)

Ответить

Номер ответа: 5
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 12.06.06 13:00
BinaryFormatter именно это и делает.. Берет дамп памяти и сохраняет его в файл. С той лишь разницей,что потом из файла можно восстановить этот самый массив..

Ответить

Номер ответа: 6
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #6 Добавлено: 13.06.06 11:41
Просто на спектруме (не кидайте в меня камнями) был специальный формат файлов Number Array, туда было очень просто выгрузить массив и потом считать его оттуда. Хотел узнать нет ли чего подобного .NET? Кстати массив уже стал одномерный, там значения не привосходят 36 и мне показалось проще перейти к 37-ричной системе и кодировать в одномерный массив.

P.S.
Кстати нет ли инструментов для работы системами произвольной размерности?

Ответить

Номер ответа: 7
Автор ответа:
 LongHornKms



Вопросов: 0
Ответов: 2
 Профиль | | #7 Добавлено: 17.06.06 07:15
Можно взять твой массив и сохранить его в виде строки BASE64.

Ответить

Номер ответа: 8
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #8 Добавлено: 17.06.06 12:41

Это как?

Ответить

Номер ответа: 9
Автор ответа:
 K&M



ICQ: 225442067 

Вопросов: 20
Ответов: 170
 Профиль | | #9 Добавлено: 17.06.06 15:17
Кстати нет ли инструментов для работы системами произвольной размерности?


Почему все последнее время на .Нет пытаются прибегнуть к помощи каких-либо компонентов, даже не пытаясь сделать хоть что-то самостоятельно?

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 17.06.06 16:39
Почему в последнее время? Дотнет для того и предназначен, чтобы как можно меньше делать самостоятельно, это его основная идеология.

Ответить

Номер ответа: 11
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #11 Добавлено: 17.06.06 16:46

Да ручками я давно все сделал, функция-то примитивная, но думал может специальный компонент будет работать быстрее, объем то не маленький.

Ответить

Номер ответа: 12
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 18.06.06 07:10
Это как?

Например через
System.Convert.ToBase64String

только я не вижу в этом выгоды... на мой взгляд сериализация более эффективна.. Особенно если черь идет о BinaryFormatter, у которого на больших объемах данных (>50Мб) скорость сохранения/чтения порядка 80 раз выше нежели аналогов XML,SOAP .. A Base64 есть не что иное как строка + потеря времени на бессмысленную конвертацию.. и следовательно можно предположить, что обрабатываться будет тоже не слишком быстро..

Ответить

Номер ответа: 13
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #13 Добавлено: 18.06.06 09:28
2 EROS
Сейчас попробывал не пересчитывать в 10-ричную систему, а писать в строковой массив прямо знаками - работает быстрее. Будет ли сериализация быстрей и для строкового массива и как правильно реализоват?

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 18.06.06 15:14
Будет ли сериализация быстрей и для строкового массива и как правильно реализоват?

Я не могу однозначно дать ответ на твой вопрос, поскольку для этого надо знать структуру твоего приложения и порядок работы со строками.. Могу лишь дать несколько рекомендаций..
 Как правило, тормоза возникают не на этапе сериализации,а на этапе именно создания и обработки массива. Лично я предпочитаю использовать не массивы в чистом в виде, а разноообразные специализированные коллекции, которые позволяют сделать тоже самое, только на порядок удобнее. В качестве примера, для работы со строками (особенно на больших объемах) во всех книгах рекомендуется использовать:
System.Text.StringBuilder

поскольку это существенно увеличивает быстродействие (проверено лично)
И ты должен понимать,что сериализовать можно, в принципе, любой объект!! (не обязательно массив) Другими словами, перед сериализаций совершенно не обязательно переводить в другую систему счисления или делать какие либо другие действия (согласись, это доп. тормоза), ты можешь сохранить тот же StringBuilder или любую другую коллекцию в первозданном виде и без всяких изменений. Причем так же легко, при необходимости, восстановить этот объект из файла..
Если же у тебя трудности с сериализацией, то примеров масса, главное понять суть этой процедуры, и тогда преимущества станут очевидны..

Ответить

Номер ответа: 15
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #15 Добавлено: 18.06.06 17:14
Вот смотри.. Давай протестируем стандартную операцию - заполнения байтового массива данными. Как правило,в большинстве случаев, размер массива заранее неизвестен, поэтому будем использовать инструкцию ReDim Preserve. Сравнивать будем обычный массив и коллекцию List(можно любую другую). Вот код теста:
        Dim arrayTest() As Byte
        Dim listTest As New List(Of Byte)
        Dim stopWatch As New Stopwatch
        Dim random As New Random

        Console.WriteLine("<-- Start Test -->";)

        '// Array Test
        stopWatch.Start()
        For Counter As Integer = 0 To 10000
            ReDim Preserve arrayTest(Counter)
            arrayTest(Counter) = random.Next(0, 254)
        Next
        stopWatch.Stop()
        Console.WriteLine("Array Test: {0} ms", stopWatch.Elapsed.TotalMilliseconds)
        stopWatch.Reset()

        '// List Test
        stopWatch.Start()
        For Counter As Integer = 0 To 10000
            listTest.Add(random.Next(0, 254))
        Next
        stopWatch.Stop()
        Console.WriteLine("List Test: {0} ms", stopWatch.Elapsed.TotalMilliseconds)
        Console.WriteLine("";)

а вот результат работы этого кода
<-- Start Test -->
Array Test: 90,3852 ms
List Test: 1,1504 ms

по-моему.. разница очевидна.
Это был тест байтового массива.. в случае использования строкового массива результат увеличивается в десятки раз, а это уже достаточно серьезные тормоза!
А вот теперь делай выводы, что лучше использовать - массивы или коллекции?

P.S. Если заранее известен размер массива, то результаты практически одинаковые, даже массив оказывается немного быстрее..

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам