2016-11-06 6 views
-3

Я разрабатываю импортерную программу для импорта больших текстовых файлов utf8 (символьные байты) в C#. если я загружаю весь 20GB-файл в ОЗУ, это решение не подходит и возможно. лучше разделить файл на несколько меньших файлов для обработки. Теперь моя проблема заключается в разделении обработки файла. мое решение читает файл по строкам и разбивает их, если номер строки - это мое подходящее число. но я думаю, что это не быстрое решение для чтения файла по строкам для разделения. время расщепления велико. есть алгоритм для разделения больших файлов utf8 на несколько файлов без чтения по строкам и быстрее.Обработка огромных файлов utf8 с разбиением на несколько файлов

+0

Нет. Нет другого способа разделить файлы (по крайней мере, в Windows), чем читать весь источник и записывать все файлы назначения. Вы можете сделать небольшую оптимизацию (нужно было бы увидеть код для рекомендаций), но это было ограничено тем фактом, что вам нужно передать 2x размер файла с/на диски. –

+0

спасибо за ваш комментарий, примерно я потратил около 10 часов на то, чтобы найти ответ на мой вопрос, но я не нашел ответа, я думаю, что ваш комментарий поможет мне принять решение. в utf-8, у меня нет решения без чтения строки за строкой tp, разделить файл и может быть разделение, не было хорошим решением для этого. – user2352554

ответ

0

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

  1. Прочитайте файл в двоичном, а не текст
  2. ли построчно не читать, как вам не требуется чтение файла для расщепления.
  3. Использование поиска. См. link.
  4. Если вам нужно сохранить разделенные файлы с полными строками, то после поиска позиции, поиска следующего символа конца строки и последующего разделения файла соответствующим образом.
  5. После того как файлы разделены, обработайте файлы по отдельности.
+0

спасибо за ваш ответ, но, знаете, моя проблема заключается в определении числа, в котором доза не разделяется на символ, например, utf-8 является переменной длиной, и я не знаю, что 1000-байтовый символ является символом конца или является середина символа, потому что в utf-8 символ может принимать до 4 байтов. – user2352554

+0

Yeh Я пропустил кодировку utf-8. В любом случае, в этом случае, как только вы пытаетесь найти какую-либо случайную позицию, вам нужно проверить, находится ли ее середина или нет. characterStartDetector = (pos, data) => (data & 0x80) == 0 || (данные & 0x40)! = 0; См. Http://stackoverflow.com/questions/452902/how-to-read-a-text-file-reversely-with-iterator-in-c-sharp. Также см. Http://stackoverflow.com/questions/31008038/opening-inputstreamreader-in-the-middle-of-utf-8-stream. Вторая ссылка - java, например. Его не сложно понять, используя его в C# –

Смежные вопросы