Большие потоки файлов с использованием C # - PullRequest
1 голос
/ 15 января 2009

Есть несколько текстовых файлов (записей), к которым мне нужно получить доступ с помощью C # .Net. Но дело в том, что эти файлы больше 1 ГБ. (минимальный размер 1 ГБ)

что мне нужно сделать? На каких факторах мне нужно сконцентрироваться?

Может ли кто-нибудь дать мне идею выйти из этой ситуации.

EDIT:

Спасибо за быстрые ответы. да, они фиксированной длины записи. Эти текстовые файлы поступают от местной компании. (Там в прошлом месяце записи транзакций)

Возможно ли получить доступ к этим файлам как к обычным текстовым файлам (используя обычный файловый поток).

и

Как насчет управления памятью ????

Ответы [ 5 ]

4 голосов
/ 15 января 2009

Расширение ответа CasperOne

Проще говоря, невозможно надежно поместить файл объемом 100 ГБ в память одновременно. На 32-битной машине просто не хватает адресного пространства. На 64-битной машине достаточно адресного пространства, но за время, которое потребуется для фактического помещения файла в память, ваш пользователь убьет ваш процесс из-за разочарования.

Хитрость заключается в постепенной обработке файла. Базовый класс System.IO.Stream () предназначен для обработки переменного (и, возможно, бесконечного) потока в разных количествах. Он имеет несколько методов чтения, которые будут прогрессировать вниз по потоку на определенное количество байтов. Вам нужно будет использовать эти методы для разделения потока.

Я не могу дать больше информации, потому что ваш сценарий недостаточно конкретен. Можете ли вы дать нам более подробную информацию, разделители записей или примеры строк из файла?

Обновление

Если они имеют фиксированную длину записи, то System.IO.Stream будет работать нормально. Вы даже можете использовать File.Open (), чтобы получить доступ к базовому объекту Stream. Stream.Read имеет перегрузку, которая запрашивает количество байтов для чтения из файла. Поскольку они имеют фиксированную длину записи, это должно хорошо работать для вашего сценария.

Пока вы не вызываете ReadAllText () и вместо этого используете методы Stream.Read (), которые принимают явные байтовые массивы, память не будет проблемой. Базовый класс Stream позаботится о том, чтобы не помещать весь файл в память (это, конечно, если вы не попросите об этом :)).

2 голосов
/ 15 января 2009

Вы конкретно не перечисляете проблемы, которые нужно преодолеть. Файл может иметь размер 100 ГБ, и у вас не будет проблем с его обработкой.

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

Более подробная информация здесь будет полезна.

0 голосов
/ 02 июля 2009

Эй, ребята, я понимаю, что это сообщение давно не трогали, но я просто хотел опубликовать сайт, на котором есть решение вашей проблемы.

http://thedeveloperpage.wordpress.com/c-articles/using-file-streams-to-write-any-size-file-introduction/

Надеюсь, это поможет!

-CJ

0 голосов
/ 15 января 2009

Расширение ответа ДжаредПара.

Если файл представляет собой двоичный файл (то есть целые числа, хранящиеся в 4 байтах, строки фиксированной длины и т. Д.), Вы можете использовать класс BinaryReader. Проще, чем вытащить n байтов, а затем попытаться их опросить.

Также обратите внимание, что метод чтения в System.IO.Stream является неблокирующей операцией. Если вы запросите 100 байтов, он может вернуть меньше этого значения, но все равно не достигнет конца файла.

Метод BinaryReader.ReadBytes будет блокироваться до тех пор, пока не будет прочитано запрошенное количество байтов или Конец файла - который когда-либо будет первым.

Приятные ребята из коллаборации:)

0 голосов
/ 15 января 2009

Каковы основные проблемы, с которыми вы сталкиваетесь в данный момент? Главное, что нужно помнить, это думать с точки зрения потоков - то есть хранить минимальный объем данных в памяти, который вы можете. LINQ отлично работает с последовательностями (хотя есть некоторые операции буферизации, которые вам следует избегать, например, OrderBy).

Например, вот способ эффективной обработки простых записей из большого файла (обратите внимание на блок итератора).

Для выполнения нескольких агрегатов / анализа больших данных из файлов рассмотрим Push LINQ в MiscUtil .

Можете ли вы добавить больше контекста к проблемам, о которых вы думаете?

...