Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте,подскажите, пожалуйста, как можно записать файл больше 8ГБ в массив байтов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2014, 07:09
Ответы с готовыми решениями:

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

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

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

6
 Аватар для Энтомолог
141 / 182 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
25.12.2014, 10:07
C#
1
File.ReadAllBytes
не работает?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.12.2014, 17:21
Никак. Индексация в .NET для одномерного массива заканчивается на 0x7FEFFFFF (2,147,483,591), следовательно выделить больше можно, но обращаться к массиву за пределами 0x7FEFFFFF без шаманств не получится.
1
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
27.12.2014, 15:01  [ТС]
NickoTin, например? на хабре нашел способ для выделения памяти ~ 10 ГБ для обычного массива,но как это для байт массива сделать не пойму.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.12.2014, 18:42
Цитата Сообщение от Salems Посмотреть сообщение
например?
Что "например"?
0
10 / 10 / 5
Регистрация: 20.04.2014
Сообщений: 161
27.12.2014, 18:44  [ТС]
NickoTin, как выделить больше 2 гб под массив байт
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.12.2014, 19:42
Посмотрите класс 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2014, 19:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru