10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
1

Как можно записать файл больше 8ГБ в массив байтов?

25.12.2014, 07:09. Показов 1182. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,подскажите, пожалуйста, как можно записать файл больше 8ГБ в массив байтов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2014, 07:09
Ответы с готовыми решениями:

Необходимо файл (любого расширения) записать в базу данных как массив байтов
Необходимо файл (любого расширения) записать в базу данных в byte форме. И затем взять его (выбрав...

Массив байтов записать в файл
Вообщем экспериментирую с шифрованием. Беру к примеру файл размером 33*663 байт. Этот файл...

Поблочно записать массив байтов в файл
Есть массив байтов размером 256 КБ. Нужно записать его поблочно в файл(повторить 10 раз, размер...

Считать файл и записать данные в массив байтов
Хочу создать класс который считывает файл и записывает данные в массив байтов. Есть следующий код....

6
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
25.12.2014, 10:07 2
C#
1
File.ReadAllBytes
не работает?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.12.2014, 17:21 3
Никак. Индексация в .NET для одномерного массива заканчивается на 0x7FEFFFFF (2,147,483,591), следовательно выделить больше можно, но обращаться к массиву за пределами 0x7FEFFFFF без шаманств не получится.
1
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
27.12.2014, 15:01  [ТС] 4
NickoTin, например? на хабре нашел способ для выделения памяти ~ 10 ГБ для обычного массива,но как это для байт массива сделать не пойму.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.12.2014, 18:42 5
Цитата Сообщение от Salems Посмотреть сообщение
например?
Что "например"?
0
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
27.12.2014, 18:44  [ТС] 6
NickoTin, как выделить больше 2 гб под массив байт
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.12.2014, 19:42 7
Посмотрите класс MemoryMappedFile.

Мысли изложенные до того как вспомнил про MemoryMappedFile
Проект должен быть под .NET >= 4.5, приложение x64 (или AnyCPU без флага 32 bit required на x64 ОС), файл конфигурации должен содержать секцию runtime как по ссылке выше или пример ниже.
XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <runtime>
        <gcAllowVeryLargeObjects enabled="true" />
    </runtime>
</configuration>
Выделяем массив не типа байт а большего типа, например [u]int/[u]long. Возьмём тип long. Массив long[0x7FEFFFFF] будет занимать в памяти ~16GB, дальше используем unsafe код для получения адреса массива и можем обращаться к массиву без контроля CLR. Но в этом случае работа с большинством классов .NET'а будет невозможна, т.к. многие работают с byte[] а не с byte*.

Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            const long sizeInInt64 = 0x7FEFFFFFL; 
            const long sizeInBytes = sizeInInt64 * 8L; // ~16 GB
            
            var buff = new long[sizeInInt64];
            fixed ( long* ptr = buff )
            {
                byte* pBuff = (byte*)ptr;
                
                // Чтобы память была действительно выделена нужно обратиться ко всем участкам
                for ( long i = 0; i < sizeInBytes; i++ )
                {
                    pBuff[i] = 10;
                }
            }
Сработает только если в системе есть непрерывный участок размером ~16GB (з.ы. у меня 32GB RAM)

Можно использовать вариант когда есть огромный массив типа long, и небольшой типа byte, читать сначала в byte массив, а потом копировать в long массив, но тут соответственно будут накладные расходы на копирование.
0
27.12.2014, 19:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2014, 19:42
Помогаю со студенческими работами здесь

Массив байтов записать в нетипизированый бинарный файл
Скажите как работать с бинарными файлами в си, а именно есть массив байтов: char; //в нем...

Как можно в .dat файл записать и прочитать массив
как можно в .dat файл записать и вытащить массив. массив: st=&quot;строка 1&quot;; st=&quot;строка 2&quot;;...

Как записать в файл список, состоящий из массива байтов?
Как записать в фаил список состоящий из массива байтов?

NAudio. Как записать звук в массив байтов?
Доброго времени суток. Есть код который записывает звук с микрофона и сохраняет его в файл...

Как записать весь в текст боксе в массив байтов?
пишу в текст бокст это 00 03 01 00 00 0C как сделать что б он записал в по 2 цифры в каждый...

Графика. Как можно представить графический файл в виде байтов
подскажите пжл.как можно представить графический файл в виде байтов???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru