![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 16.02.2013
Сообщений: 36
|
![]()
Под Linux.
У меня есть файлы размером ~ 1-2Гб, задача распарсить файл, сделать изменения, и сохранить изменённую копию. Файл размером около ~1 Гб парсится примерно 6 минут и всё успешно, то есть результат совпадает с желаемым, а с двухгигабайтными начались приколы. Программа обрабатывает где-то 1,4Гб за минут 18, потом с огромной скоростью пишет в файл какие-то данные (не мусор, tail выдаёт осмысленное содержимое), но за минут 5 размер выходного файла доходит до 20 Гб и продолжает расти. Условие на выход из цикла обработки read(...) == 0 или -1. Как такое может быть? Откуда он вообще берёт эти данные? Будто файл никогда не заканчивается. Последний раз редактировалось UaKot; 11.04.2017 в 22:20. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Дык код покажите, тут не телепаты.
2 ГБ может переполнение int32 где-то.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 16.02.2013
Сообщений: 36
|
![]()
Код основной функции такой.. он не причёсан совсем
Код:
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]()
ssize_t write(int fildes, const void *buf, size_t nbytes);
Field Description int fildes The file descriptor of where to write the output. You can either use a file descriptor obtained from the open system call, or you can use 0, 1, or 2, to refer to standard input, standard output, or standard error, respectively. const void *buf A null terminated character string of the content to write. size_t nbytes The number of bytes to write. If smaller than the provided buffer, the output is truncated. return value Returns the number of bytes that were written. If value is negative, then the system call returned an error. write не обязательно запишит столько байт, сколько ему дали, может и меньше. Реальное число записаных - в результате (думается мне, с read примерно та же ситуация). У вас это все не учтено совсем. И это не кешированый ввод-ввывод. Потому и так долго. Используйте fwrite/fread, а еще лучше std::fstream C++ Эти ваши гигабайты ворочаются от силы 30 секунд с верным кешем. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сортировка больших файлов. | stpdqstns | Общие вопросы C/C++ | 6 | 05.03.2013 22:52 |
Загрузка больших файлов | Rita26 | JavaScript, Ajax | 2 | 09.08.2012 11:23 |
Загрузка больших файлов | Rita26 | Общие вопросы .NET | 0 | 23.07.2012 14:47 |
Отправка больших файлов по почте | pu4koff | Софт | 6 | 17.07.2012 19:35 |
Загруprf больших файлов в blob | eldalex | SQL, базы данных | 4 | 12.10.2010 16:10 |