· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› I/O

Посл.отвђт Сообщенiе


Дата: Июн 14, 2003 14:22:44

Посоветуйте, какой самый быстрый способ чтения/записи файлов. Имеется файл 4 ГБ (и более). Его надо полностью проанализировать. Я читаю функцией ReadFile по 20 мегов. Не знаю, может быть можно файлы быстрее читать? Если кто знает, подскажите, плиз.

Рома


Дата: Июн 14, 2003 16:54:42

Полагаю что для больших файлов лучше юзать FileMapping, но не факт что будет быстрее (хотя удобнее определенно) - не проверял :)


Дата: Июн 14, 2003 19:25:15

Dr.Golova
но не факт что будет быстрее
Через FileMapping будет медленнее (проверял именно на 2Гб и более).


Дата: Июн 16, 2003 05:11:34

roma
надо полностью проанализировать
Что конкретно надо делать?

Quantum
будет медленнее (проверял именно на 2Гб и более
В чем заключается проверка?
Какие результаты?
На какой конфигурации (hard, soft)?


Дата: Июн 16, 2003 05:37:43 · Поправил: Quantum

В чем заключается проверка?
Надо было подсчитать контрольную сумму всего винта (CRC32, вроде) Давно это было... под FAT32 (Windows 95), ~30Гб HD... больше не помню.

Какие результаты?
FileMapping заметно (!) тормозил по сравнению с обычным ReadFile.

Может в NTFS и в новых виндах всё иначе, но, IMHO, если FileMapping тормозил раньше, то от него и сейчас трудно ожидать лучшего.


Дата: Июн 16, 2003 06:37:45

Quantum
FileMapping заметно (!) тормозил ... Может в NTFS
Я пробовал считать количество строк в большом файле, используя MMF (Very Large File Line Count:). На NTFS медленнее, чем FAT32. Однако в сравнении с thread+ReadFile проигрыша не вижу.


Дата: Июн 16, 2003 09:42:19

Что конкретно надо делать?
Надо вырезать из dat-файла те участки, где значения выше определенной границы. Т.е., если граница 10, а содержимое файла 01 12 12 32 9, то будет вырезано 12 12 32. Вообще-то это не суть важно, что как надо анализировать файл (анализ гораздо больший), просто мне было интересно, как по самому скоростному читать файл. Я читаю по 20 мегов в буфер, а потом перебираю каждый байт в этом буфере.
Сам анализ занимает достаточно малую часть, 80% времени занимает чтение из файла.
Можно конечно сделать два потока: в одном читать файл, в другом анализировать. А можно еще и третий - для записи на вырезанных участков. Но знаете, прога-то уже готова, а мне переделывать ее совсем не хочется, тем более, что она, можно сказать, пошла в благотворительность.


Дата: Июн 16, 2003 10:15:29

roma
сделать два потока: в одном читать файл, в другом анализировать
В указанной мною ссылке (в варианте с thread+readfile), отдельные потоки читают и анализируют разные куски файла (наверное, на машине с более чем одним процессором, такой вариант будет быстрее), а не специализируются на определенной работе.
В случае со специализацией потоков я выигрыша не вижу плюс добавляется проблема синхронизации.


Дата: Июн 16, 2003 10:54:53

FileMapping более удобен потому, что (IMHO) он обращается к ReadFile плюс предоставляет дополнительные возможности.


Дата: Июн 16, 2003 11:26:05

pas
В моем случае, когда надо обработать весь файл в прямом направлении от начала до конца, вряд ли можно сказать, что FileMapping более удобен. Ладно бы, если бы файл читались куски файла из разных мест в произвольном порядке, другое дело.
Да и тем более меня интересует быстродействие, а не удобства. Че я, японец какой-нибудь, что ли, я же русский (к вопросу о Японских авто).

P2M
Не знаю, никогда раньше не занимался многопоточным программированием, поэтому не могу сказать получу ли я выигрыш. Просто я подумал, что раз чтение файла самая медленная часть программы, то пусть файл читается постоянно в отдельном потоке, а анализ прочитанного происходит в другом потоке. Т.е. если сделать все в одном потоке (как у меня сейчас), то чтение из файла "простаивает", пока анализируется прочитанный буффер. А в два потока получиться, что файл постоянно читается,
и одновременно происходит анализ предыдущего прочитанного файла. Т.к. t(чтение) >> t(анализ), то синхронизацию будет не так уж и сложно сделать. Однако, это все не точно, так просто размышляю.


Дата: Июн 16, 2003 12:33:29 · Поправил: P2M

roma
Сделайте вариант с MMF и сравните производительность. (сюда результаты, чтобы была информация для размышления)

пусть файл читается постоянно в отдельном потоке
Куда, в один и тот же буфер?

Т.к. t(чтение) >> t(анализ), то синхронизацию будет не так уж и сложно сделать.
Вы шутите? Не так просто.

одновременно происходит
У Вас сколько процессоров?
Если один, то все происходит псевдоодновременно.
Притом очередной поток может быть прерван в любом месте для передачи кванта времени другому потоку.

Imho писАть многопоточное приложение для вашего случая можно с прицелом на многопроцессорную систему. Afaik чем больше потоков в системе, тем больше между ними конкуренции.


Дата: Июн 16, 2003 14:31:59

Короче вывод: юзай ReadFile и не НИИ мозги.

Всем спасибо за инфо.

Пока


Дата: Июн 16, 2003 19:47:37

P2M
Afaik чем больше потоков в системе, тем больше между ними конкуренции
Это особенно заметно на 9x, где многопоточность реализована крайне жидко. IMHO, юзать более двух потоков имеет смысл только на NT.

roma
Короче вывод: юзай ReadFile
Точно


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.058