|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
Чтение файла по частям29.06.2018, 11:25. Показов 8256. Ответов 36
Метки нет (Все метки)
Всем здравствуйте, нужно мне считать файл в память, при этом разделить файл на равные куски и потом как то обратиться к этим кускам.
Не понятен механизм разделения самого файла, и как потом к этим кускам обращаться. Заранее спасибо.
0
|
|
| 29.06.2018, 11:25 | |
|
Ответы с готовыми решениями:
36
Чтение бинарного файла по частям Загрузка большого текстового файла. Как грузить его по частям Чтение списка из файла и дальнейшее использование информации из файла |
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||||||
| 29.06.2018, 11:43 | ||||||
|
Здравствуйте, для текстового файла можно так порезать примерно ровные куски. Последний кусок будет с довеском.
1
|
||||||
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 29.06.2018, 11:48 [ТС] | |
|
Спасибо за ответ, а если это файл не текстовый, который я хочу считать и он будет не маленького размера, и главное вот все улеглось в массив.верно а как мне обращаться к кускам этого файла,например чтобы взять кусок и что то с ним сделать
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||
| 29.06.2018, 11:58 | ||
|
Мдфв1234, string[] поменять на byte[][]
---- Хотя супер-огромные файлы (например фильмы по 25 гигов) надо считывать уже поточно, чтобы буфер был вечно маленьким.
0
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
|
| 29.06.2018, 12:03 | |
|
Так а конечная цель какая?
Файл можно просто целиком считать в файл в виде массива байтов 'File.ReadAllBytes' и потом обращаться к нужным участкам по вычисляемому индексу (номер фрагмента умноженный на размер фрагмента). Можно полученный массив байтов разрезать на несколько маленьких массивов и хранить их в виде коллекции. В этом случае доступ к конкретному куску будет по простому индексу, а не по вычисляемому (как в первом случае). Можно, с целью экономии ресурсов, последовательно считать данные из файла и сложить их в массивы байтов фиксированной длины налету досоздавая новые по мере надобности. В итоге получится то же, что и в предыдущем случае.
0
|
|
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 29.06.2018, 12:04 [ТС] | |
|
вот как раз вопрос с потоком меня и интересует, а смысл маленького буфера при этой операции какой, вернее почему он должен быть маленьким?
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|||
| 29.06.2018, 12:05 | |||
|
Мдфв1234,
0
|
|||
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 29.06.2018, 12:08 [ТС] | |
|
Вообще вот такую я себе задачу поставил, нужно взять файл , учитывая что он может быть большим, разрезать его на части равные, и эти части поместить например в какую нибудь очередь, и уже из этой очереди брать куски файла этого и что то(мне нужно понять механизм, потому действие не важно) с ним сделать.
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 29.06.2018, 12:11 | |
|
Мдфв1234, условимся, что большой файл не влезет в оперативную память ни в виде массива. ни в виде очереди, ни в виде другой коллекции.
Получается, в оперативной памяти лежит только огрызок.
1
|
|
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 29.06.2018, 12:14 [ТС] | |
|
да вот это я как раз умом понимаю , но не знаю с какой стороны подступиться, потому пусть каждый кусок файла будет писаться в новый файл, то есть будет один файл на выходе, в который дописывались бы все куски.
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||
| 29.06.2018, 12:19 | ||
|
1) порезать файл на мелкие файлы. 2) собрать мелкие файлы в большой файл. Берите авторучку и лист бумаги: в компьютере лежит огрызок и больше ничего не влезает. Сохранять позицию в любом файле можно в виде целого числа. Считал - передвинул позицию. Записал - передвинул позицию.
1
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
||||||
| 29.06.2018, 12:23 | ||||||
Если файл у вас огромный и в память не влазит, то метод можно модифицировать следующим образом: 1. Дать ему доступ к какому-нибудь разделяемому (с другим потоком) ресурсу, например, очереди. 2. В цикле чтения проверять размер очереди. Если кусочков в ней меньше некоторого количества, то досчитывать следующий, если лимит превышен, то делать паузу и ждать, пока обрабатывающий поток справится с предыдущими кусочками. Если обработка кусков последовательная, то можно рассмотреть другую реализацию - простая обёрка поверх стрима, которая умеет методом 'GetNextPart' вовзращать следующий кусок для обработки. При этом сама обёртка хранит состояние стрима и прочие параметры, заданные при иницилизации (путь к файлу, размер куска, размер буфера, если требуется).
0
|
||||||
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 29.06.2018, 12:23 [ТС] | |
|
а наглядно как то можно посмотреть операцию с позициями в файле, то есть по логике мне же надо будет эту позицию в потоке найти , чтобы понять где границы куска и плюс запомнить, откуда начинать другой кусок
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 29.06.2018, 12:30 | |
|
Мдфв1234, поэтому и говорю, на листе бумаге всё будет понятно по смыслу.
Все границы запоминаются в целых числах. Потом внимательно ещё раз почитайте учебник/MSDN о классах файлового ввода-вывода.
0
|
|
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 02.07.2018, 11:55 [ТС] | |
|
Еще вопросы, определился , что все складывать буду в очередь, так мне кажется будет удобнее, вот если у меня кусок считался в буфер, буфер емкостью 1024 байта,как понять что буфер полный и нужно забирать данные от туда?
Как я понимаю очередь по размеру всегда будет в 2 раза или в 4 раза больше чем буфер, значит там в один момент времени будет больше одного куска,вопрос,как забрать именно нужный кусок и затем очистить очередь именно от этого куска, как я понял очередь это может сделать сама методом Dequeue(),(я заберу кусок и очищу очередь от него ). Далее я читаю из потока файл,прочитал первые 1024 байта, положил их в очередь,далее, сдвинул указать на 1204 байта, снова прочитал 1024 и так далее, или есть способ проще, чтобы разделать файл на куски. Заранее спасибо за ответы.
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||||||
| 02.07.2018, 12:29 | ||||||
|
Мдфв1234,
ещё раз. Нет там никакой очереди. Оформим огрызок в виде буфера - массив байт допустим размером 1 мегабайт. Отдельным числом можно запоминать, сколько в этом буфере реальных байт, если не до упора заполнен. Из большого файла можно читать из FileStream порциями по 1 мегабайту.
array Type: System.Byte[] При возврате этот метод содержит указанный массив байтов, в котором значения в диапазоне от offset до (offset + count - 1)) заменены байтами, считанными из текущего источника. offset Type: System.Int32 Смещение в байтах в массиве array, в который будут помещены считанные байты. count Type: System.Int32 Максимальное число байтов, предназначенных для чтения. Ну не сложно же в MSDN прочитать. https://msdn.microsoft.com/ru-... .110).aspx
1
|
||||||
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 02.07.2018, 12:40 [ТС] | |
|
Спасибо , как раз вот этот момент и читаю.
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 02.07.2018, 12:46 | |
|
Мдфв1234, лист бумаги и авторучку так и не удалось вчера взять?
0
|
|
|
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
|
|
| 02.07.2018, 12:50 [ТС] | |
|
да про ручку и бумагу, она со мной всегда.(покажите пример,как бы вы работали с ручкой и бумагой, буду признателен,) просто опыта маловато, теории много, а тут задача с заковыкой, и посложнее чем считать текстовый файл.
0
|
|
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 02.07.2018, 13:09 | |
|
Мдфв1234, Например, большой файл - отрезок от 0 до 100.
В компьютер влезает 20. Можно отметить границы и числа. Очень сложная задача - сколько раз число 20 помещается в числе 100. На листе бумаги это видно наглядно.
0
|
|
| 02.07.2018, 13:09 | |
|
Помогаю со студенческими работами здесь
20
Копирование файла по фиксированным частям Просмотр типизированного файла по частям При загрузке файла по частям сервер фиксирует ошибку UPLOAD_ERR_PARTIAL
Как заменить чтение строки из консоли на чтение текстового файла? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|