powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / замена 2 произвольных строк в огромном файле
18 сообщений из 118, страница 5 из 5
замена 2 произвольных строк в огромном файле
    #39055623
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T, покажи что fsutil покажет по статусу test.tst
Не понял что надо. Почитал хэлп все равно не понял чего за софтина такая. Давай конкретно как ее надо запустить.
В целом какая-то нездоровая прога, права админа требует.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055627
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запусти cmd от Администратора.
И сделай нечто вроде.

Код: plaintext
1.
2.
3.
4.
5.
D:\vuze>fsutil sparse queryflag Burlesque.2010.BDRip.avc.RG.tru.mkv
 This file is NOT set as sparse

D:\vuze>fsutil sparse queryrange Burlesque.2010.BDRip.avc.RG.tru.mkv
 The specified file is NOT sparse


Вот фильм указан как обычный файл. Не разрежённый. Раньше у меня стоял m-Torrent он до закачки
взводил атрибут sparse. А этот дурацкий Vuze - не умеет или я ево не настроил фиг поймёшь ну вобщем
как-то так.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055632
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что пишет
Код: plaintext
1.
2.
>fsutil sparse queryflag test.tst
У этого файла НЕ установлен атрибут "Разреженный"
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055634
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВот что пишет
Код: plaintext
1.
2.
>fsutil sparse queryflag test.tst
У этого файла НЕ установлен атрибут "Разреженный"


Начни в него что-то писать. Точечно.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055657
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНачни в него что-то писать. Точечно.
Чуть поправил код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <windows.h>


int main(int argc,char **argv) {
	HANDLE f = CreateFile("test.tst", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_RANDOM_ACCESS, NULL);
	if( f == INVALID_HANDLE_VALUE) {
		printf("open file error %d\n", GetLastError());
		return 0;
	}
	unsigned int size = 1000000000;

	HANDLE fm = CreateFileMapping(f, NULL, PAGE_READWRITE, 0, size, NULL);
	if(!fm) {
		printf("error %d CreateFileMapping()\n", GetLastError());
		CloseHandle(f);
		return 0;
	}

	char* mem = (char*) MapViewOfFile(fm, FILE_MAP_WRITE, 0, 0, size);
	if(!mem) {
		printf("error %d MapViewOfFile()\n", GetLastError());
	} else {
		mem[0] = 1;
		mem[100500] = 1;
		FlushViewOfFile(mem, size);
		UnmapViewOfFile((void*) mem);
	}
	CloseHandle(fm);
	CloseHandle(f);
	printf("Time %d ms\n", clock());
	return 0;
}


Смотрю фарой. Куча ноликов и две 1 там где написал в коде.
Код: plaintext
1.
2.
>fsutil sparse queryflag test.tst
У этого файла НЕ установлен атрибут "Разреженный"


Можешь сам затестить. Код дал.

На самом деле тема интересная. Выделить кусок места на диске без инициализации. Есть же malloc() для памяти, а для диска нет аналога. но я не могу тут понять что значит "Разреженный", у меня только ассоциация с экселем и пр. таблицами, но зачем это на уровне файлов? Взять те же торенты, размер известен, надо заранее знать что в итоге все войдет на диск, чтобы в послений момент не словить ошибку что место кончилось. В моем примере тоже самое, место на диске занимается реально.
Добавил FlushViewOfFile() все равно 0 мс, тут точно как-то хитро контроллер HDD задействуется.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055668
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tно я не могу тут понять что значит "Разреженный"Разреженный (sparse) - файл, который не занимает места на диске. Система создаёт запись в каталоге, но не выделяет такому файлу дисковых кластеров, а просто помечает весь файл или отдельные его диапазоны как "пустоты".

Есть и второй вариант - создаём файл, позиционируем, пишем "ноль байт" и закрываем.
Дальше возможны варианты:
1. Система честно расписывает дисковое пространство нулями - надёжно, но медленно;
2. Система помечает кластер как "все нули", но откладывает запись до момента, пока в файл не будет записан хотя бы байт.
Будет ли выполняться запись во все кластеры файла или только в те, в которые попали записываемые данные - не знаю.

При любом из двух вариантов mmap получит набор обнулённых страниц, что будет сделано диспетчером виртуальной памяти без чтения кластеров диска.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055675
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDima Tно я не могу тут понять что значит "Разреженный"Разреженный (sparse) - файл, который не занимает места на диске. Система создаёт запись в каталоге, но не выделяет такому файлу дисковых кластеров, а просто помечает весь файл или отдельные его диапазоны как "пустоты".
Спасибо. Значит я правильно понимаю этот термин. Но зачем это надо? Кто-нибудь модет предложить реальное применение этой фиче? Разве что эксель перенести на файловый уровень.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055676
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКто-нибудь модет предложить реальное применение этой фиче?1. Разреженные матрицы;
2. Экономить место на диске и ускорять ввод-вывод
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055685
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov1. Разреженные матрицы;
Это то что я писал "эксель на файловом уровне".
Basil A. Sidorov2. Экономить место на диске и ускорять ввод-вывод
А это хрень полная. Откуда те файлы с кучей нулей? Это же нездоровые грабли, не вписывающиеся в общепринятую логику. Допустим мне надо место на диске, но занять пока нечем, я записал кучу нулей но реально место на диске не получил и в один прекрасный момент получу ошибку записи в середину файла.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055690
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОткуда те файлы с кучей нулей
например, реализация хэш-таблицы
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055694
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TОткуда те файлы с кучей нулей
например, реализация хэш-таблицы
На файловом уровне? Это типа разрешаем чесать правое ухо левой ногой и говорим что это норма?

К хэш таблицам у меня отдельное непонимание. Особенно по поводу О(1).

ЗЫ mayton, это пятничная тема для тестов, только ТЗ придумать надо.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055729
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНа самом деле тема интересная. Выделить кусок места на диске без инициализации. Есть же malloc() для памяти, а для диска нет аналога. но я не могу тут понять что значит "Разреженный", у меня только ассоциация с экселем и пр. таблицами, но зачем это на уровне файлов? Взять те же торенты, размер известен, надо заранее знать что в итоге все войдет на диск, чтобы в послений момент не словить ошибку что место кончилось. В моем примере тоже самое, место на диске занимается реально.
Добавил FlushViewOfFile() все равно 0 мс, тут точно как-то хитро контроллер HDD задействуется.
Идея - старая как говно Торвальдса. Создаём новый файл в режиме write | binary.
Не через fopen. А через нормальнй API который с хендлами работает. Через open (в линуксе).
Изначально он имеет нулевой размер. Курсор стоит в нулевой позиции.
Дёргаем lseek(handle,2*1024*1024*1024); Получаем два гигабайта нулей.
Далее эффект будет зависет от реализации драйвера файловой системы.
Тоесть я на 100% не знаю какой будет эффект. Но современные Linux
filesystems не аллоцируют место на диске. А просто помечают что создана цепочка
sparse-блоков. Эффект при чтении будет такой как будто читаем нули.
При доступе на запись блоки начнут реально аллоцироваться ФС.
(Здесь я могу ошибаться т.к. точно не знаю имеют ли место блоки
либо биткарта блоков либо еще бох знает что так что пускай Пингвино-филы
меня поправят. Не обижусь)

Где-то читал что есть протокол-договорённость для Ораклов и прочих DBMS
что аллокация табличных пространств идёт именно по такому методу. Во многих
стандартах и спецификациях файловых форматов нули имеют особое значение.
Вроде как оптимизация пространства что-ли.

m-Torrent использовал эту фичу. В старых версиях под WindowsXP я специально
конфигурил проперти чтоб торрент так работал. У меня на диске D: было порядка
200 Гб места для качания музла и фильмов но логиеский размер был поядка 500 Гб.
Profit ! Главное было - вовремя скачанное кино нарезать на DVD.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055732
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDima TКто-нибудь модет предложить реальное применение этой фиче?1. Разреженные матрицы;
2. Экономить место на диске и ускорять ввод-вывод
Любой random-access доступ на запись к больному файлу который изначально пуст.
Пример с торрентами и с Ораклами я уже приводил. Добавить больше нечего.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055734
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как в Windows - ХЗ. Наверное также. Только надо файл создать со специальным флажком sparse.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот толко нагуглил. Не проверял.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364596(v=vs.85).aspx
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39055755
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВыделить кусок места на диске без инициализации. Есть же malloc() для памяти, а для диска нет аналога.
malloc - плохая аналогия,
лучше mmap с флагом MAP_NORESERVE
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39056398
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TА это хрень полная. Откуда те файлы с кучей нулей?Например - неадекватные тесты.Допустим мне надо место на диске, но занять пока нечем, я записал кучу нулей но реально место на диске не получил и в один прекрасный момент получу ошибку записи в середину файла.Это если у вас есть "завышенные привилегии" и желание возиться с API разреженных диапазонов.
Если по рабоче-крестьянски спозиционировать указатель и записать ноль байт - получится и быстро и резервированием места на диске.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39057811
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за задержку ответа.

Dima TpetravБыла задача чтения текстового файла на несколько гигабайт. Просто таблица с данными — потом данные отправлялись на обработку. Читался этот файл с помощью обычного fscanf(). Автору программы показалось, что его приложение тормозит именно из-за операций чтения из файла. :) В общем, я разобрался с меппингом файлов и программу перевели на sscanf(). Я не верил в какое-то ускорение, а даже предполагал замедление программы.

Случилось ужасное. Производительность приложения на маппинге упала в сотни раз (или даже в тысячи, точно не помню)....
мап тут вообще ни при чем, у тебя главный тормоз scanf`ы. Надо было писать свой парсер строки заточенный под твою строку. В идеале разбор строки в один проход. Дальше без разницы: читать кусок файла в буфер, парсить, читать следующий кусок и т.д. или сделать мап и обработать как один большой кусок.
Вариант с мап просто удобнее, т.к. код меньше и проще. В случае с буфером надо попутно решать проблемы контроля вся ли строка в буфере, докачка в буфер с учетом этого и т.п. В принципе несложно, но с мап этого вообще не надо.

Дальше от непонимания сути рождаются домыслы из серии "мап - магическая штука :)"
LOL, Dima T , спасибо за разъяснения очевидных вещей. Конечно, дело в sscanf. Это был пример совершенно неожиданных проблем с маппингом при применении обычных приёмов программирования. А жизнь так складывается (у меня), что он не очень то и нужен. Если бы маппинг так просто и давал ускорение почти везде, то все только им бы и пользовались.

Dima TpetravНу хорошо. Предположим, что в данном алгоритме при меппинге ОС так разрулила контроллером диска, что данные никогда не проходили через интерфейсную шину диска, данные никогда не были в оперативной памяти и контроллер сам внутри винчестера всё скопировал. И в этом и результат такой впечатляющий.

Мне почему-то кажется, что используя меппинг мы отказываемся от кеширующего механизма ОС. Что в 99.9% случаев приведёт к кардинальному замедлению программ. И при меппинге нужно подключать специалиста и чётко обосновывать зачем и как мы это делаем. И самим реализовывать кеширование. Возможно я не прав.
ХЗ что ответить на этот поток сознания :)

Напишу как я понимаю работу виндовса с файлами: при любом доступе к файлу (копирование, чтение, мап) данные из файла попадают в кэш ОС, а дальше при повторном чтении (неважно fread() или мап) берутся уже из кэша. При записи сначала пишется в кеш, затем из кэша на диск (в файл).

Теперь рассмотрим детально что происходит на примере изменения 1 байта в файле:
1. Мап. Замапили файл, обращаемся в этому байту, происходит чтение 4 кб (страницы памяти) в кэш, т.е. получаем страницу физической памяти ассоциированную с куском файла, дальше эта физическая страница подставляется в адресное пространство моего процесса, т.е. фактически я меняю сразу в кэше ОС. Дальше менеджер памяти скидывает из кэша на диск.
2. fread(1 байт) происходит чтение 4 кб (страницы памяти) в кэш (как в п.1), оттуда байт копируется в память моего процесса, затем там его меняю, fwrite(1 байт) - ОС копирует из моей памяти в ту самую страницу кэша. Дальше как в п.1

Никакой мистики и магии. Мап быстрее за счет того что нет этих лишних копирований в памяти. Работа напрямую с кэшем ОС. И плюс накладные расходы на вызов fread()/fseek()/fwrite() в цикле.
А ничего, что копирование в памяти занимает пренебрежимо малое время по сравнению с файловым вводом/выводом? И это малое время дало маппингу ускорение в разы?

И читаешь ты не по одному байту, а в основном 1*bufSize байт, блин.

PS: Попробуй плиз свою программу с меппингом запустить с флешки. Или с сетевого диска.
...
Рейтинг: 0 / 0
18 сообщений из 118, страница 5 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / замена 2 произвольных строк в огромном файле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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