|
буферизированное копирование
|
|||
---|---|---|---|
#18+
Есть такой примитивный код. Вся его задача -- сменить кодировку текстового файла. Проверку ошибок и using можно добавить, но они не критичны в рамках данной задачи. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Вопрос. Как переделать этот код, чтобы копирование происходило буферизировано и работало бы на файлах особо большого объема > 2Gb. Порции по полгига, например. Желательно не порционировать по строкам, а просто прикрутить буфер на низком уровне потока чтения,записи файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2015, 16:49 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
a_voronin, самое простое читать и записывать построчно. Если ожидаются файлы с очень длинными строками, то читать и писать блоки символов: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2015, 17:37 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
bazile, Да спасибо, вот так наверное лучше записать. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2015, 17:44 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
a_voronin, если доступен async/await (версия фреймворка позволяет), то ещё лучше будет асинхронный код. Можно взять здесь: Task-based Asynchronous Pattern , by Stephen Toub. В самом конце он во всех вариантах рассматривает вопрос. И вообще архиполезная книга! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2015, 21:30 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
bazile, А всё-таки мы не правы. Команда OpenRead открывает потом с размером буфера по умолчанию. 4096 public static FileStream OpenRead(string path) { return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); } public FileStream(string path, FileMode mode, FileAccess access, FileShare share) : this(path, mode, access, share, 4096, FileOptions.None, Path.GetFileName(path), false) { } А вопрос был про то, как чтение запись файла правильно буферизировать. Кто-то может сказать как правильно задавать размеры буфера. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2015, 12:28 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
a_voronin, чего это за файлы такие текстовые по 2 гига ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2015, 12:35 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
hVostta_voronin, чего это за файлы такие текстовые по 2 гига bcp output -- долгая история -- выгрузка в невиндовую файловую систему ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2015, 12:44 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
a_voroninА вопрос был про то, как чтение запись файла правильно буферизировать. Кто-то может сказать как правильно задавать размеры буфера. Вот вы показали исподнее метода OpenRead - что после этого неясно? Вам непонятно что это за буфер? Или для чего вообще нужна буферизация? Или код ваш по прежнему валится с OutOfMemory? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2015, 13:04 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
a_voroninА всё-таки мы не правы. Команда OpenRead открывает потом с размером буфера по умолчанию. 4096 Какой ужас. Дальше ты откроешь что у Windows есть свой буфер чтения/записи и что у диска тоже есть кеш? a_voroninА вопрос был про то, как чтение запись файла правильно буферизировать. Интересно что неправильно в текущем решении? Оно возможно менее эффективно чем решение с большим размером буфера, но ничего неправильного я в нем не вижу. a_voroninКто-то может сказать как правильно задавать размеры буфера. Используй один из конструкторов FileStream принимающего bufferSize. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2015, 13:17 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
bazileИнтересно что неправильно в текущем решении? Оно возможно менее эффективно чем решение с большим размером буфера, но ничего неправильного я в нем не вижу. Приведенный выше код нихрена, как выяснилось, не работает. Проверьте. Вот рабочий вариант Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2015, 18:17 |
|
буферизированное копирование
|
|||
---|---|---|---|
#18+
a_voronin, мой пример работает, твой нет потому что вместо типа char[], там используется byte[]. Это означает что байты записываются без перекодировки. Есть правда одна ошибка - вместо File.Open(args[1])) лучше использовать File.Create(args[1])) чтобы если файл существует, он был бы открыт в режиме truncate. Также использование BinaryWriter имеет еще один побочный эффект при использовании UTF8 - BOM не записывается. Однако для UTF8 все равно рекомендуется его не использовать и на чтении файла это не отразится при известной кодировке. Но если это проблема, то исправление очень простое. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2015, 21:59 |
|
|
start [/forum/topic.php?fid=17&msg=39051135&tid=1349497]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
179ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 244ms |
total: | 525ms |
0 / 0 |