powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / замена 2 произвольных строк в огромном файле
25 сообщений из 118, страница 2 из 5
замена 2 произвольных строк в огромном файле
    #39054013
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНо если ты выделил память (ей сопоставился своп) прочитал из файла кусок в эту память, и кусок не влез, то он сначала частично уйдет в своп, затем когда ты пишешь в файл идет сначала чтение из свопа в память (чего нет в памяти). Ну и зачем тут своп если вместо него сразу можно использовать исходный файл?
Давай порассуждаем. Когда занимаются оптимизацией I/O (это я как бывш) ораклоид говорю - то
ведут учёт количеста ввода вывода. Между random access (seqiental) и serial (scattered) вводят
метрики полезности или штрафные коэфициенты. Например 1 последовательный скан объёмом
128 Mb даёт больше пользы для перформанса чем 256 чтений по 512 килобайт.

Закрывая глаза на метрики. Можем просто учесть количество изменений в байтах.

В нашей конкретной задаче нам нужно либо.

1) Либо обновить содержимое символьного файла с адресов AXXXX-AYYYY и BXXXX-BYYYY на нужные char[].
в том случае когда строки одинаковы по размеру.
2) Обновить объединение этих строк со сдвигом серединки. СXXXX-CYYYY если длины строк разные.

Эти обе операции решаются блочной записью. И я не знаю зачем и для чегео нам нужно привлекать механизм
отображения оперативной памяти на диск или уж тем более на своп.

Возможно я не прав. Но в таком случае нас рассудит либо Windows perfmon либо Linux IO stat.

То software которое даст меньший объём физического чтения+записи будет более эффективным.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054025
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravМожет легче кластеры на файловой системе переставить? Насколько я понимаю файл — это список кластеров на носителе данных. Вот этот список и нужно подредактировать не перемещая сами данные.
Это если сдвиг на число байт кратное размеру кластера. В остальных случаях все равно читать-писать.
И не просто это, если вообще возможно, сомневаюсь что ОС пустит к кластерам из обычного приложения. Не знаю эту тему, ни разу не пробовал.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054029
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivНо это надо в памяти кусок YYY держать, что может быть накладно.
не надо - подвигать можно и не сохраняя в памяти ничего, одного буфера достаточно

Это как ?
Каждый раз я должен записать из памяти кусок по младшим адресам в файле, старшие при этом могут быть затёрты, или перед ними будет сделана дырка. Значит, старый блок надо считать перед этим в память, чтобы потом записать его дальше.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054031
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзопропилпропущено...

ага, mmap вместо последовательного доступа - охрененно эффективно.

Я про виндовый мап писал. CreateFileMapping(). В виндовсе эффективно. Возможно в линуксах по-другому устроено, не пользовался.

Оно тебе не даст ровно ничего в смысле упрощения задачи или уменьшения кол-ва IO.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054041
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TpetravМожет легче кластеры на файловой системе переставить? Насколько я понимаю файл — это список кластеров на носителе данных. Вот этот список и нужно подредактировать не перемещая сами данные.
Это если сдвиг на число байт кратное размеру кластера. В остальных случаях все равно читать-писать.
Так в том то и дело, что нам придётся перезаписывать всего несколько граничных кластеров на файловой системе. По сути задача сводится к перезаписи нескольких десятков килобайт. А вся задача целиком — к последовательному чтению всего файла (в худшем случае). Время на поиск строк можно игнорировать. Узкое место тут — это чтение файла.

Dima TИ не просто это, если вообще возможно, сомневаюсь что ОС пустит к кластерам из обычного приложения. Не знаю эту тему, ни разу не пробовал.
Само собой. А как работают сторонние программы дефрагментации? Вот-вот.

В крайнем случае напишем свой драйвер файловой системы. И мы в шоколаде, получаем премию.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054052
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭти обе операции решаются блочной записью. И я не знаю зачем и для чегео нам нужно привлекать механизм
отображения оперативной памяти на диск или уж тем более на своп.
Отображения оперативной памяти на своп это принцип работы виндовса, поэтому он происходит по умолчанию. Но при желании ты можешь изменить это умолчание.
Как только ты выделяешь память malloc()/new ОС ассоциирует ее со свопом, на случай если эту память надо будет освободить. Другой вопрос будет ли сброс на диск этой памяти. Если памяти много - не будет.
MasterZivОно тебе не даст ровно ничего в смысле упрощения задачи или уменьшения кол-ва IO.
IO будет одинаково при достаточном объеме памяти и меньше с мапом если вариант без мапа задействует своп. Выше писал. Если реальной памяти не хватит то будет дополнительный IO на своп блока в памяти (в который ты закэшируешь то что обратно писать).
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054075
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravDima Tпропущено...

Это если сдвиг на число байт кратное размеру кластера. В остальных случаях все равно читать-писать.
Так в том то и дело, что нам придётся перезаписывать всего несколько граничных кластеров на файловой системе. По сути задача сводится к перезаписи нескольких десятков килобайт. А вся задача целиком — к последовательному чтению всего файла (в худшем случае). Время на поиск строк можно игнорировать. Узкое место тут — это чтение файла.
Давай на примере: сектор 3 байта. Это данные
Код: plaintext
1.
|q|w|e|r|t|y|u|i|o|p|a|s|d|f|g|h|j|k|l|z|x|c|v|b|
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |
меняем "w" на "lzxcv"
Покажи как кластеры передвинуть не переписывая.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054105
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot mayton]Dima TКогда занимаются оптимизацией I/O (это я как бывш) ораклоид говорю - то ведут учёт количеста ввода вывода.
I/O в СУБД это другое, оракл не изучал, в основном MSSQL, но суть таже. Там оптимизация за счет индексов, статистик и т.п., т.е. за счет организации и использования метаданных. Там оптимизация сводится к тому чтобы прочитать минимум метаданных и получить данные или указатель на место где данные.
Тут мы говорим про более низкий уровень. У нас нет метаданных.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054110
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonЭти обе операции решаются блочной записью. И я не знаю зачем и для чегео нам нужно привлекать механизм
отображения оперативной памяти на диск или уж тем более на своп.
Отображения оперативной памяти на своп это принцип работы виндовса, поэтому он происходит по умолчанию. Но при желании ты можешь изменить это умолчание.
Ты знаешь. Мне кажется я уже вижу следующий пятничный бенчмарк №2. OMG!
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054124
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Некоторые люди думают, что MMF это такая магия, позволяющая работать прямо с диском, а не
тонкая обёртка над теми же ReadFile/WriteFile.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054133
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТы знаешь. Мне кажется я уже вижу следующий пятничный бенчмарк №2. OMG!
Я был уверен что этим кончится
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054153
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли реальной памяти не хватит то будет дополнительный IO на своп блока в памяти (в который ты закэшируешь то что обратно писать).
ты серьёзно собрался весь файл в память прочитать?
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054159
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonТы знаешь. Мне кажется я уже вижу следующий пятничный бенчмарк №2. OMG!
Я был уверен что этим кончится
Тебе страшно? :)
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054161
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tpetravпропущено...

Так в том то и дело, что нам придётся перезаписывать всего несколько граничных кластеров на файловой системе. По сути задача сводится к перезаписи нескольких десятков килобайт. А вся задача целиком — к последовательному чтению всего файла (в худшем случае). Время на поиск строк можно игнорировать. Узкое место тут — это чтение файла.
Давай на примере: сектор 3 байта. Это данные
Код: plaintext
1.
|q|w|e|r|t|y|u|i|o|p|a|s|d|f|g|h|j|k|l|z|x|c|v|b|
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |
меняем "w" на "lzxcv"
Покажи как кластеры передвинуть не переписывая.
Ты знаешь, у меня не получилось сходу выполнить твою задачу. Я переставляю эти буквы, путаюсь в них и начинаю жутко нервничать. Будем считать, что ты поставил меня в тупик. Но мне кажется очевидным, что я прав.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054162
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилты серьёзно собрался весь файл в память прочитать?
Тут 18155678 то что я собрался читать. Тут 18159433 MasterZiv с картинками тоже самое расписал.

Если это к тому что я про мап писал, то CreateFileMapping() всего файла не приводит к чтению всего файла.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054167
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravТы знаешь, у меня не получилось сходу выполнить твою задачу.
И не получится. Упрощаю картинку чтоб тебе ничего не двигать.
Надо из этого
Код: plaintext
1.
|q|w|e|r|t|y|u|i|o|p|a|s|d|f|g|h|j|k|l|z|x|c|v|b|
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |
получить это
Код: plaintext
1.
|q|l|z|x|c|v|e|r|t|y|u|i|o|p|a|s|d|f|g|h|j|k|w|b|
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |

Данные сместились внутри каждого сектора .
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054180
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TpetravТы знаешь, у меня не получилось сходу выполнить твою задачу.
И не получится. Упрощаю картинку чтоб тебе ничего не двигать.
Надо из этого
Код: plaintext
1.
|q|w|e|r|t|y|u|i|o|p|a|s|d|f|g|h|j|k|l|z|x|c|v|b|
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |
получить это
Код: plaintext
1.
|q|l|z|x|c|v|e|r|t|y|u|i|o|p|a|s|d|f|g|h|j|k|w|b|
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |

Данные сместились внутри каждого сектора .
Ты меня не понял. Смысл в том, что нужно поменять список кластеров. Как-то так:

Код: plaintext
|  7  |  8  |  2  |  3  |  4  |  5  |  6  |  1  |

И подредактировать содержимое трёх кластеров, не трогая остальные кластеры. В общем случае мы должны отредактировать список кластеров (минимально). И редактировать содержимое максимум четырёх кластеров.

Но я прощу прощения, что пока не смог формализовать свою мысль.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054191
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остался пустяк. Найти API которое нам лихо будет играть в пасьянс кластерами.

И это вам не чортов FAT16/32.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054214
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто как ?
примерно так ( если в другую сторону нужно - тогда двигаться назад)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	
	long long start = 256;
	long long shift = 1;
	long long len = 10000;
	FILE *f = fopen("c:\\temp\\b.jpg", "r+b");
		
	const int  bufSize = 4096;
	char buf[bufSize];
	_fseeki64(f, start+shift, SEEK_SET);
	while (len > 0){
		int bs = bufSize < len ? bufSize : len;;
		fread(buf, 1, bs, f);
		_fseeki64(f, -shift-bs, SEEK_CUR);
		fwrite(buf, 1, bs, f);
		_fseeki64(f, shift, SEEK_CUR);
		len -= bufSize;
	}
	fclose(f);
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054215
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще. Отностительно storage не было никаких заявок. На чём файл приедет?
На флешке? На мобиле с microSD? На гугл-драйве? На (OMG!) DVD диске?
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054218
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravИ подредактировать содержимое трёх кластеров, не трогая остальные кластеры.
как это не трогать? у тебя что, кластеры в один байт?
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054223
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ вообще. Отностительно storage не было никаких заявок. На чём файл приедет?
На флешке? На мобиле с microSD? На гугл-драйве? На (OMG!) DVD диске?
ну да, если доступен по PTP/MTP - остаётся только целиком переписывать
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054233
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилpetravИ подредактировать содержимое трёх кластеров, не трогая остальные кластеры.
как это не трогать? у тебя что, кластеры в один байт?
Нет. У нас в файле два региона. У каждого региона по две границы (память линейная). Эти две границы произвольным образом находятся в максимум двух кластерах. Итого у нас максимум четыре кластера которые нужно изменять. Всё остальное мы «переставляем» меняя список (массив?) кластеров, который по сути является списком физических адресов кластеров на носителе. Кроме четырёх кластеров и списка мы ничего не перемещаем. А это всего несколько десятков килобайт на изменение.
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054241
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonИ вообще. Отностительно storage не было никаких заявок. На чём файл приедет?
На флешке? На мобиле с microSD? На гугл-драйве? На (OMG!) DVD диске?
ну да, если доступен по PTP/MTP - остаётся только целиком переписывать
Да при такой постановке всё шаманство безсмысленно. Один хер надо файл вычитать
и записать. Тоесть вернуться к самой первой и правильной мысли. Пока не пусто прочитать из файла в цикле
очерденую строку. Сделать нужные замены в строке. Сохранить строку. ИЧСХ
никто не придёрется к концепции. Кесарю - кесарево.. Текстовику - текстовый API
...
Рейтинг: 0 / 0
замена 2 произвольных строк в огромном файле
    #39054252
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

у тебя кластеры переменной длины?

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


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