LINUX.ORG.RU

чтение файлов


0

0

нужно читать файл кусками. файл может быть 10 Кб, а модет и 100 Мб.

почему fopen+fread работает на _порядок_ быстрее чем mmap+memcpy ? так и надо ?


> почему fopen+fread работает на _порядок_ быстрее
> чем mmap+memcpy ? так и надо ?

вопрос _очень_ некорректный. где и в каком месте
и при каких условиях медленнее?

теме не менее да, часто mmap работает медленнее,
или не дает ожидаемого прироста в скорости из-за
большей нагрузки на tlb cache, потерь на page
faults. а лишнее (в случае read) копирование на
современных процессорах не стоит ничего: данные
копируются "внутри" L1/L2 caches.

idle ★★★★★
()
Ответ на: комментарий от idle

ну при каких условиях ? при обычных - включил комп, запустил прогу с раставленными таймерами - fopen+fread занимает 1 мс, а mmap+memcpy - 30 мсек.

CKulT
() автор топика
Ответ на: комментарий от CKulT

> ну при каких условиях ? при обычных - включил комп, > запустил прогу с раставленными таймерами как-то сразу и не подберешь приличных слов для ответа... что делает программа??? лучше код покажите. если хотите, чтобы его читали - упростите до предела.

idle ★★★★★
()
Ответ на: комментарий от idle

я кажись русским языком объяснил.

1)
unsigned char line1[5][1024*1024];
FILE *f = fopen("/home/ckult/1.bmp");

for(int i = 0;i < 5;i++)
  fread(line[i], 1024*1024, 1, f);

fclose(f);

2)

int fd = open("/home/ckult/1.bmp", O_RDONLY);

unsigned char *p = (unsigned char*)mmap(0, 1024*1024*5, PROT_READ, MAP_SHARED, fd, 0);
for(int i = 0;i < 5;i++)
{
  memcpy(line[i], p, 1024*1024);
  p += 1024*1024;
}

close(fd);

CKulT
() автор топика
Ответ на: комментарий от CKulT

так на хрена же копировать, если mmap() используется?
естесcтвенно, эта memcpy() все замедляет, так что
сравниваете вы яблоки и апельсины.

считайте, что mmap() возвращает unsigned char (*)[1024*1024],
и работайте с указателем без копирования.

idle ★★★★★
()
Ответ на: комментарий от idle

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

CKulT
() автор топика
Ответ на: комментарий от CKulT

что-то мы друг друга не понимаем.

по поводу скорости - см мой первый ответ.

зачем копировать, не могу понять? повторю. вы
собираетесь что-то делать с с массивом line, куда
вы копируете из указателя p = mmap(). выбросьте
line (и копирование), и работайте с p непосредственно,
как будто это и есть массив.

что-то я настолько очевидные вещи пытаюсь обьяснить,
что, похоже, я чего-то не понял?

idle ★★★★★
()
Ответ на: комментарий от idle

наверно ) мне _раскодировать_ надо некоторые файлы, а чтобы это сделать надо считать N байт и манипулировать с ними. сами по себе голые данные из файла мне ненадо. я привёл пример при простейшем чтении, а что будет, если надо раз 5000 прочитать кусочками ?

CKulT
() автор топика
Ответ на: комментарий от CKulT

> мне _раскодировать_ надо некоторые файлы, а чтобы это
> сделать надо считать N байт и манипулировать с ними.
> сами по себе голые данные из файла мне ненадо.
> я привёл пример при простейшем чтении, а что будет,
> если надо раз 5000 прочитать кусочками ?

вообще ни одного предложения не понял. даже любопытно
стало, в чем проблема.

данные после memcpy() не меняются. какая разница, с чем
работать, с данными, или их копией???

у меня закрадывается подозрение, что вы полагаете, что
в mmap() память нельзя писать.

idle ★★★★★
()
Ответ на: комментарий от idle

>>>в mmap() память нельзя писать да не, мануалки я хорошо читаю -)

короче мне эти данные надо передать на уровень выше (этот код будет в .so, данные надо передать в вызывающую программу). поэтому их надо куда-нить скопировать.

CKulT
() автор топика
Ответ на: комментарий от CKulT

> короче мне эти данные надо передать на уровень выше
> (этот код будет в .so, данные надо передать в вызывающую
> программу. поэтому их надо куда-нить скопировать.

все, мой спортивный интерес иссяк :) что значит, "куда-нить"?
если у вас так все устроено, что данные нужны вызывающей
программе в _определенном_ месте, то туда и надо читать,
конечно, и mmap() вообще не причем. но для больших
обьемов данных такое устройство выглядит, хм... нехорошо :)


idle ★★★★★
()
Ответ на: комментарий от CKulT

CKulT (*) (26.05.2004 14:08:26):

Извини, ты _оказываешься_ понимать то, что тебе говорят!

> вызывающая прога передаёт либе указатель, ...

Ну и передавай ей то, что mmap тебе вернул!

Или сравнивай mmap с таким кодом:

unsigned char line1[5][1024*1024]
              line2[5][1024*1024];
FILE *f = fopen("/home/ckult/1.bmp");

for(int i = 0;i < 5;i++)
  fread(line1[i], 1024*1024, 1, f);

fclose(f);

for(int i = 0;i < 5;i++)
  memcpy(line2[i], line1[i], 1024*1024);

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.