Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение и запись / 16 сообщений из 16, страница 1 из 1
20.03.2013, 19:34
    #38192061
Alex_kip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Имею следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void main()
{
	FILE *resource=fopen("111.txt","rb");
	FILE *resource2=fopen("112.txt","wb");
	int c=0;
	while((c=fgetc(resource))!=EOF)
	{
		fprintf(resource2,"%c",c);
	}
	fclose(resource);
	fclose(resource2);	
}



Просто как бы копирую файл 111.txt, но почему-то такое "копирование" занимает очень много времени.
Как вручную можно открывать, читать и писать в файл, но тратить меньшее время?
...
Рейтинг: 0 / 0
20.03.2013, 20:18
    #38192151
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
fread() / fwrite() тебя спасут.
...
Рейтинг: 0 / 0
20.03.2013, 20:28
    #38192165
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Alex_kipпочему-то такое "копирование" занимает очень много времени.

Потому что делается побайтово, да ещё и с преобразованием в процессе. Как уже сказали -
использование крупных блоков спасёт ОРД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.03.2013, 12:43
    #38194665
Westtrd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Alex_kip,

Есть еще такие трюки в линуксе как vmsplice/sendfile
В этом случае работа вообще ведется на ядерном уровне с минимальным оверхедом в пользовательском пространстве за счет техник zero-copy + DMA
...
Рейтинг: 0 / 0
22.03.2013, 13:23
    #38194783
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Alex_kipпочему-то такое "копирование" занимает очень много времени.


А какого объёма файлы ?

Dimitry SibiryakovПотому что делается побайтово, да ещё и с преобразованием в процессе. Как уже сказали -
использование крупных блоков спасёт ОРД.


Как бы операционка и RTL всё равно буферизируют файлы, поэтому тут проблема не в самом побайтовом копировании скорее,
а в накладных расходах на вызовы функций fgetc fprintf на каждый байт файла.
...
Рейтинг: 0 / 0
22.03.2013, 16:45
    #38195180
Alex_kip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Westtrd, я под win пишу программы
...
Рейтинг: 0 / 0
22.03.2013, 16:48
    #38195186
Alex_kip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Моя основная идея - написать какой-нибудь архиватор или компрессор, что само по себе предполагает посимвольный перебор. Но посимвольно оказывается сильно долго(
...
Рейтинг: 0 / 0
22.03.2013, 16:51
    #38195192
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Отнюдь не предполагает. Скорее наоборот. Но даже и если бы, посимвольный перебор не
означает посимвольное чтение. Считал пару мегабайт в память, переработал по символу,
записал результат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.03.2013, 16:54
    #38195200
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Alex_kipWesttrd, я под win пишу программы

DMA присуствует в любом современном компьютере независимо от установленной на него ОС.

Только мапьте на адрес в памяти выравнянный по границе кластера ФС по другому ДМА не сможет попасть в адреса , и все пойдет через промежуточный буфер (КЕШ ФС).
...
Рейтинг: 0 / 0
22.03.2013, 16:56
    #38195204
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Из файла в файл копировать командой memcpy .

Приблизительно так.
...
Рейтинг: 0 / 0
24.03.2013, 00:50
    #38196226
Westtrd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
ДохтаР,

Ну, у каждого свой выбор, пишите и далее под винду :)
memcpy в файловых операциях есть нонсенс :)
И да, DMA надо уметь приготавливать.
...
Рейтинг: 0 / 0
24.03.2013, 00:52
    #38196228
Westtrd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Dimitry SibiryakovОтнюдь не предполагает. Скорее наоборот. Но даже и если бы, посимвольный перебор не
означает посимвольное чтение. Считал пару мегабайт в память, переработал по символу,
записал результат.
Основной оверхед у ТС - сисколлы
...
Рейтинг: 0 / 0
24.03.2013, 05:56
    #38196289
Alex_kip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Dimitry Sibiryakov, мне для статистики нужно будет его сначала побайтово считать я так понимаю, чтобы посчитать кол-во вхождений каждого символа
...
Рейтинг: 0 / 0
24.03.2013, 10:23
    #38196329
aleks-sam
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Alex_kipDimitry Sibiryakov, мне для статистики нужно будет его сначала побайтово считать я так понимаю, чтобы посчитать кол-во вхождений каждого символа
Да никто не читает побайтово. Статистику можно и в буфере уже посчитать.
Если хочешь все же побайтово, то все верно твой код работатет - работает медленно.
...
Рейтинг: 0 / 0
24.03.2013, 17:01
    #38196505
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Господа, что-то мне кажется, какой бы ни был оверхед на вызовы функций при посимвольном I/O, при буферизированном I/O (а функции f* как раз буферизируют) он не должен быть заметен на фоне задержек на непосредственно дисковых операциях.
Может просто надо вместо fprintf применить fputc?
У fprintf, выводящей всего один символ в цикле, намного больше оверхед чем у fputc.
...
Рейтинг: 0 / 0
25.03.2013, 01:21
    #38196753
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение и запись
Anatoly Moskovsky,

Нет, там именно в накладухе на вызовы дело. Реальные операции чтения все равно будут блоками. Ну или это надо уж совсем н знаю какую ОС древнюю или странную.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение и запись / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]