Страница: 1 | 2 |
Вопрос: Как грамотно сохранить массив?
Добавлено: 11.06.06 10:54
Автор вопроса: dr.Faust
Есть байтовый массив 8х1000000, ну или где-то около того. Как его лучше сохранить в файл. Не в текстовой же побайтно загонять?
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #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
Например через
только я не вижу в этом выгоды... на мой взгляд сериализация более эффективна.. Особенно если черь идет о 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
Я не могу однозначно дать ответ на твой вопрос, поскольку для этого надо знать структуру твоего приложения и порядок работы со строками.. Могу лишь дать несколько рекомендаций..
Как правило, тормоза возникают не на этапе сериализации,а на этапе именно создания и обработки массива. Лично я предпочитаю использовать не массивы в чистом в виде, а разноообразные специализированные коллекции, которые позволяют сделать тоже самое, только на порядок удобнее. В качестве примера, для работы со строками (особенно на больших объемах) во всех книгах рекомендуется использовать:
поскольку это существенно увеличивает быстродействие (проверено лично)
И ты должен понимать,что сериализовать можно, в принципе, любой объект!! (не обязательно массив) Другими словами, перед сериализаций совершенно не обязательно переводить в другую систему счисления или делать какие либо другие действия (согласись, это доп. тормоза), ты можешь сохранить тот же StringBuilder или любую другую коллекцию в первозданном виде и без всяких изменений. Причем так же легко, при необходимости, восстановить этот объект из файла..
Если же у тебя трудности с сериализацией, то примеров масса, главное понять суть этой процедуры, и тогда преимущества станут очевидны..
Номер ответа: 15
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #15
Добавлено: 18.06.06 17:14
Вот смотри.. Давай протестируем стандартную операцию - заполнения байтового массива данными. Как правило,в большинстве случаев, размер массива заранее неизвестен, поэтому будем использовать инструкцию ReDim Preserve. Сравнивать будем обычный массив и коллекцию List(можно любую другую). Вот код теста:
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(""
а вот результат работы этого кода
Array Test: 90,3852 ms
List Test: 1,1504 ms
по-моему.. разница очевидна.
Это был тест байтового массива.. в случае использования строкового массива результат увеличивается в десятки раз, а это уже достаточно серьезные тормоза!
А вот теперь делай выводы, что лучше использовать - массивы или коллекции?
P.S. Если заранее известен размер массива, то результаты практически одинаковые, даже массив оказывается немного быстрее..