CPP: влияет ли размер файла на время его открытия/закрытия?
зы
в твоём нике три ошибки
По второму вопросу: что имеешь в виду под "очистить"? Заполнить нулями или сделать нулевого размера?
в трэд призываются телепатыуже
зы.
в твоем нике ни одной ошибки.
хотя все же надеюсь, что одна фактическая есть.
По второму вопросу: что имеешь в виду под "очистить"? Заполнить нулями или сделать нулевого размера?сделать нулевого размера
// по идее
fopen("filename","w");да, есть такое.
// по идее
а влияет ли его размер на скорость удаления содержимого?
на нормальных ФС - не должно сильно зависеть.
Да.
Зависит от файловой системы.
---
"This user is BSD-compliant."
Если это не какая-то супермегаФС с фиксированным размером файлов или еще чего =)
А как? Уменьшаться (т.е, 2 файла по 1 мб удалятся медленнее, чем 1 файл 2 мб) или наоборот?
---
...Я работаю...
Про фрагментацию что-нибудь слышал? Я думаю это главный фактор для многих ФС.
если так важна скорость — close, rename и unlink в отдельном трэде
Про фрагментацию что-нибудь слышал? Я думаю это главный фактор для многих ФС.А, все, дошло.
Ну а порядки времени хоть сопоставимые? Ну вряд ли больше,чем в три раза отличаются, верно?
Я про этот случай
(т.е, 2 файла по 1 мб удалятся медленнее/быстрее, чем 1 файл 2 мб)
Например, один файл, который целиком хранится в таблице разбиения и файл из статыщфрагментов.
Вообще может быть расскажешь уже реальную задачу?
а где узнать про средние значения для удаления разных по размеру файлов? Они действительно могут очень сильно отличаться?
Можно узнать, как-то даже сам измерял какой-то программулиной под линукс. Но это все равно в модельных условиях: файлы только что создавались, тут же удаляются. Там от ФС действительно зависело (XFS и reiser были).
Но зачем?
зависит от файловой системы и контекста. нетрудно создать ситуацию когда unlink или close будут исполняться сколь угодно долго.
В этом случае очень сомневаюсь.Досталась БД в виде текстового файла, надо создать несколько БД по имени/фамилии/телефону/месту проживания/году рождения в порядке возрастания соотв. ключей. Упрощенно говоря, в этом и есть суть задачи.
Вообще может быть расскажешь уже реальную задачу?
Ну хорошо. А ты не пытался подсчитать время, которое тебе понадобится, чтобы вообще написать эту программу? Я как бы о том, не похуй ли сколько это будет работать. Запусти, узнаешь.
Досталась БД в виде текстового файла, надо создать несколько БД по имени/фамилии/телефону/месту проживания/году рождения в порядке возрастания соотв. ключей. Упрощенно говоря, в этом и есть суть задачи.сколько записей?
какой размер файлов?
сколько записей?нес. десятков млн.
какой размер файлов?
нес. гигов.
У меня что-то все нереально долго работает. Не могу понять: то ли с компом что-то, то ли файлы нереально большие.
"То ли алгоритм плохой" — не рассматривается?
А вообще если несколько гигов, то не стоит удивляться. Что за винт? Долго — это сколько?
нес. десятков млн.файлов в одном каталоге?
после 6-ой минуты убивал прогу.
файлов в одном каталоге?записей
после 6-ой минуты убивал прогу.А зря Оставь на пару часов, это нормально. И проблема не в открытии/закрытии/создании, а в обработке этих данных. Все же даже просто копирование "нескольких Гб" может занимать больше 6ти минут, а это на порядки более простая операция, да и реализована она очень эффективно.
Все же даже просто копирование "нескольких Гб"ляяя
действительно
столько раз фильмы копировал же...
а как оценить? пару часов ждать надоест. Да и не факт, что сработает, потестить надо.
На ночь оставь. Все пацаны так делают. Еще можешь в программу добавить простейший прогресс-индикатор. Хотя бы просто чтобы иногда (подчеркиваю: иногда, например, каждую тысячу записей) выводил количество обработанных строк.
вставь печать прогресса
Потестить — на меньшем файле (отрежь от исходного тыщу строк).
как показывает практика, каждую тысячу записей - это не иногда, а дофига часто, можно 65536 попробовать. ну или каждые 1024 записи, кажется так кошернее.
Ну да, надо поболее. Но почему степень двойки кошернее —
а влияет ли его размер на скорость удаления содержимого?На скорость, наверное, не влияет (кроме крайних случаев а вот, скажем, время может и линейно зависеть, если файл на магнитной ленте, ня?
наверное, не влияет (кроме крайних случаев)файлы, помещающиеся целиком в MFT - это крайний случай?
Ну да, ня?
На ночь оставь. Все пацаны так делают. Еще можешь в программу добавить простейший прогресс-индикатор. Хотя бы просто чтобы иногда (подчеркиваю: иногда, например, каждую тысячу записей) выводил количество обработанных строк.оставил. Комп перегрелся и выключился. Тут в инете поковырялся и нашел, что если ввести в cmd ввести команду mem, то максимальный размер исполняемой программы около 600 000 байт. Нельзя ли этот параметр как-нибудь увеличить? От чего он зависит? И на что влияет?
Тут в инете поковырялся и нашел, что если ввести в cmd ввести команду mem, то максимальный размер исполняемой программы около 600 000 байт. Нельзя ли этот параметр как-нибудь увеличить? От чего он зависит? И на что влияет?это для dos-овских программ.
у тебя должна быть не досовская программа, если конечно ты ее не turbo c компилируешь.
Тут в инете поковырялся и нашел, что если ввести в cmd ввести команду mem, то максимальный размер исполняемой программы около 600 000 байт.не правда, всем приложениям взятым вместе хватает 640кб, а все эти разговоры про гигабайты оперативки - маркетинговый ход для того, чтобы у производителей памяти были деньги
640кб
ну да, где-то так и получается.
А как можно увеличить память для программы (допустим, чтобы создавать массивы большего размера)? И как зависит 640 кб от 1 Гб? Если бы у меня было 2 Гб, то вместо 640 было бы примерно 1280 кб?
ты программу в чем компилируешь?
visual studio
visual studioтогда у тебя ограничение по памяти должно быть 2гб, или 2 000 000 кб. если, конечно. на компе своп не отключен, тогда будет меньше, по кол-ву имеющегося озу
у меня гиг оперативки. А что такое своп? Как его включать/выключать? Почему-то при задании массива из инт с более, чем 200000 элеементов генерится исключение .
Почему-то при задании массива из инт с более, чем 200000 элеементов генерится исключение .потому что ты его в стеке выделяешь, а стек маленький, надо в куче выделять
Почему-то при задании массива из инт с более, чем 200000 элеементов генерится исключение .ты на стеке его создаёшь? Впрочем, всё равно хрень какая-то, обычно предельный размер стека больше. Но всё равно следует делать так:
int *array = new int[1048576];или, если пишешь на C, то
///....
//в конце работы с массивом:
delete[] array;
int *array = malloc(sizeof(int)*1048576);
....
free(array);
потому что ты его в стеке выделяешь, а стек маленький, надо в куче выделятьэто посредством malloc/free?
это посредством malloc/free?лучше посредством std::vector<int>
а как в стеке выделять?
Но что-то все равно долго. Можно еще поинтересоваться? Как сосчитать, сколько времени занимает обращение к диску
(последовательное чтение через файловый поток или
чтение через файловый поток--> небольшие действия с только что полученными данными -->чтение через файловый поток)?
В инете пробовал поискать задачки, чтобы разрюхать, но не нашел.
замерить сколько твоя программа обрабатывает файл, и за сколько времени он копируется
это даст тебе понимание насколько теоретически твою программу можно ускорить.
зы
копировать лучше в nul
а как в стеке выделять?Объявлением локальных переменных. Но если хочется именно выделять, то есть такая замечательная функция _alloca. Однако нужна она редко.
Может ты всё-таки выложишь код (если он не слишком большой) и примеры входных данных? Авось тебе подскажут, если у тебя что-то неоптимально реализовано.
А что такое своп? Как его включать/выключать? Почему-то при задании массива из инт с более, чем 200000 элеементов генерится исключение .
Тут в инете поковырялся и нашел, что если ввести в cmd ввести команду mem, то максимальный размер исполняемой программы около 600 000 байт.парень
ты понимаешь что после таких твоих незнаний базовый вещей твоя прога скорее всего написана очень криво (кривой алгоритм, кривые механизмы)
почитал бы что ли книжки сначала какие-нить
просто в свете этого становится совсем нелепым изначальный вопрос "CPP: влияет ли размер файла на время его открытия/закрытия?"
> ....
> free(array);
Это (чаще всего) неправильный способ использовать malloc, не учи дурному.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Профилирование --- это отдельная и очень интересная тема.
> последовательное чтение через файловый поток или чтение через
> файловый поток--> небольшие действия с только что полученными
> данными --> чтение через файловый поток
Если тебе надо быстрее, то надо не профилированием заниматься, а ускорять.
Изучай mmap и aio.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
отсутствием проверки на NULL. Я понимаю, что в худшем случае оно
словит SIGSEGV, но. А вдруг памяти не хватает или ulimit?
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
int *array = malloc(sizeof(int)*1048576);
if(!array)
{
fprintf(stderr, "GOLAKTEGO OPASNOSTE!1111111\n\n\nnewlinenewlinenewline\n\n");
crash_badly_and_destroy_CPU_and_display_adapter;
exit(0);
}
Ня?
NULL не обязательно 0, для начала, у него другой тип.
> fprintf(stderr, "GOLAKTEGO OPASNOSTE!1111111\n\n\nnewlinenewlinenewline\n\n");
> crash_badly_and_destroy_CPU_and_display_adapter;
> exit(0);
Прикольно, программа не работает, но возвращает нулевой код завершения.
А ещё в линуксах так и не изобрели errx(3).
---
Q9: А почему Линукс не ОС?
A9: ОС - это БЗДя
А ещё в линуксах так и не изобрели errx(3).да есть они, есть. это главный повод для гордости у *бздшников?
NULL не обязательно 0, для начала, у него другой тип.if(array != NULL)
И да, NULL не обязательно определен.
Прикольно, программа не работает, но возвращает нулевой код завершения.Спасибо, Майор!1111
Может ты всё-таки выложишь код (если он не слишком большой) и примеры входных данных? Авось тебе подскажут, если у тебя что-то неоптимально реализовано.Спасибо за предложенную помощь, но я хочу попытаться сам.
в инете нашел
5.4.1.2. Головки чтения/записи данных
Головки чтения/записи работают только при вращении пластин, над которыми они «парят». Так как чтение и запись данных возможно только при перемещении носителя под головками, время, необходимое для того, чтобы нужный сектор полностью прошёл под головкой, в значительной мере определяет вклад, который вносит головка в общее время доступа. Для диска с 10 000 оборотов/мин и 700 секторами на дорожке это время в среднем составляет 0,0086 миллисекунд.
умножил время 0.0086 милисекунд на число операций вида f1>>s1 и f2<<s2 (f1 и f2 — потоки ifstream, ofstream) — с точностью до множителя 1.3 время работы проги на малом (нес. млн подобных операций) значении совпадает с полученным теоретически. Правильно ли я сосчитал, если предположить, что время, затраченное на др. операции, пренебрежимо мало?
Но только не понятно, чему тогда соответствует это время:
5.4.1.3. Задержка, вызванная вращением
Так как пластины диска крутятся постоянно, маловероятно, что в момент получения запроса ввода/вывода пластина будет находиться в той точке, в которой сразу можно обратиться к нужному сектору. Следовательно, даже если все остальные компоненты диска готовы обратиться к этому сектору, они должны ждать, пока под головкой не окажется нужный сектор вращающейся пластины.
Вот почему в высокоскоростных дисках обычно пластины диска вращаются обычно с большей скоростью. Сегодня скорость 15 000 оборотов/мин. имеют самые скоростные диски, тогда как для дисков начального уровня считается достаточной скорость 5 400 оборотов/мин. В среднем для диска 10 000 оборотов/мин. задержка составляет около 3 миллисекунд.
А так уже все понял, скоро закончу.
с точностью до множителя 1.3Так у тебя же диск небось 7500 оборотов, как раз в 1.3 раза медленнее. Можешь успокоиться.
пареньА какую книгу ты можешь посоветовать?
ты понимаешь что после таких твоих незнаний базовый вещей твоя прога скорее всего написана очень криво (кривой алгоритм, кривые механизмы)
почитал бы что ли книжки сначала какие-нить
просто в свете этого становится совсем нелепым изначальный вопрос "CPP: влияет ли размер файла на время его открытия/закрытия?"
P.S. Ты, наверное, нереально крут. Сколько у тебя на брэйнбэнче (срр) и на топкодере(алгоритмы)? Просто интересно, соответствуют ли твои слова твоим многочисленным понтам.
Так у тебя же диск небось 7500 оборотов, как раз в 1.3 раза медленнее. Можешь успокоиться.Скорее всего. Дык расчет правилен? И куда впихивается время 3 миллисекунды?
Правильно ли я сосчитал, если предположить, что время, затраченное на др. операции, пренебрежимо мало?Неправильно. Ты не перевёл размер своих данных в количество секторов. Не учёл кэширование. Не учёл, что одновременные операции могут значительно снижать скорость ввода-вывода.
P.S. Ты, наверное, нереально крут. Сколько у тебя на брэйнбэнче (срр) и на топкодере(алгоритмы)? Просто интересно, соответствуют ли твои слова твоим многочисленным понтам.Где таких умных слов нахватался? Имей совесть, будь поспокойнее.
Ща
[telepathy on]
Надеюсь ты считываешь одну строку, решаешь куда ее записать и записывашь, а не пытаешься считать сразу все?
[telepathy off]
Дык расчет правилен?Мне кажется, что твой расчёт с точностью да наоборот повторяет расчёт автора абзаца про 0.0086 милисекунд и произведён в абсолютно такой же среде.
И куда впихивается время 3 миллисекунды?Их там не было. Это данные из другого эксперемента.
PS а да, я не телепат, если что
Надеюсь ты считываешь одну строку, решаешь куда ее записать и записывашь, а не пытаешься считать сразу все?да. Точнее, предельное число строчек, которые вмещаются в оперативку.
Мне кажется, что твой расчёт с точностью да наоборот повторяет расчёт автора абзаца про 0.0086 милисекунд и произведён в абсолютно такой же среде.когда в файле, например, миллион слов, то пишешь
char s[100];
while(f>>s) ; // цикл идет миллион раз, f - поток вывода
то время для считывания равно 1 000 000 * 0.0086 миллисекунд = 8.6 секунды, верно?
Неправильно. Ты не перевёл размер своих данных в количество секторов. Не учёл кэширование. Не учёл, что одновременные операции могут значительно снижать скорость ввода-вывода.
А чтобы хотя бы оценить? Ну чтобы знать, что прога будет работать несколько часов, а не неделю, такой расчет подойдет?
А чтобы хотя бы оценить? Ну чтобы знать, что прога будет работать несколько часов, а не неделю, такой расчет подойдет?Не подойдёт.
P.S. Ты, наверное, нереально крут. Сколько у тебя на брэйнбэнче (срр) и на топкодере(алгоритмы)? Просто интересно, соответствуют ли твои слова твоим многочисленным понтам.зря обиделся
лучше бы к совету прислушался
зря обиделсяЯ не обиделся, ты для меня не близкий человек. Совета по поводу книги я так и не услышал. Можешь в приват ББ-срр и ТК-алг написать, если на людях стесняешься. Ну и о з.п., как посоветовали.
лучше бы к совету прислушался
Но повторюсь, это судя по треду.
Так что понты у тебя лишние, имхо.
когда в файле, например, миллион слов, то пишешьу нас в школе, среди части народу, который посещал кружки по информатике, было популярным написание программ, режущих файлы на части (чтобы их залить на народ и потом иметь возможность в случае чего иметь к ним доступ)...
char s[100];
while(f>>s) ; // цикл идет миллион раз, f - поток вывода
Моя программа почему-то работала заметно быстрее других... Оказалось, что остальные читали по символу или по несколько символов, а я вызывал чтения блока размером в 256 байт. Не потому, что я догадался, что так будет быстрее, а потому, что прочитал про паскалевские функции блочного чтения/записи в книжке и мне захотелось их испытать. Опыт смешной, но поучительный.
а нам в школе прямо говорили, что в задачах стоит использовать блочное чтение, что существенно ускоряет ввод и вывод данных - достаточно затратной операции для школьных задач
а мне в "школе" говорили, что надо использовать буферизированные потоки
Присваивание во время объявления чаще всего сопровождаетсяНекоторые вообще считают, что в обычных пользовательских программах проверять на каждый чих выделенную память - это лишнее, так как выплюнуть наверх вменяемую диагностику с большой вероятностью может не получиться, а программа и так вылетит... На всяких особых случаях (например сервер, который должен работать в режиме 24/7 и на котором предусмотрен резерв памяти не рассматриваем, т.к. подобные вещи скорее лучше делать на уровень ниже, а на уровне пользователя процедурами выделения просто указывать критичность нехватки).
отсутствием проверки на NULL. Я понимаю, что в худшем случае оно
словит SIGSEGV, но. А вдруг памяти не хватает или ulimit?
а программа и так вылетит...в ряде случаев, может не вылететь, а запороть память
типа такого
int * p = (int*)malloc(sizeof(int) * 100000);
p[99999] = 0;
Некоторые вообще считают, что в обычных пользовательских программах проверять на каждый чих выделенную память - это лишнее, так как выплюнуть наверх вменяемую диагностику с большой вероятностью может не получиться, а программа и так вылетит...Когда лень выводить диагностику, проще тупо использовать враппер, который просто выполнит abort
p.s.: а вообще, можно для этого NULL изменить на такое значение, чтобы прибавление разумных величин приводило к невалидному для записи адресу (например, под 32хбитной вендой это 0x80000000, либо 0xC0000000 если при загрузке использовался ключ /3Gb). Хотя это плохо сработает с кодом, который проверяет на NULL подразумевая что это 0. Можно и просто использовать библиотеку, в которой malloc будет возвращать такой указатель (даже если NULL - это (void*)0 но это плохо если какой-то код проверяет указатели на NULL-ёвость.
> if(!array)http://c-faq.com/null/ptrtest.html
NULL не обязательно 0, для начала, у него другой тип.
c-faq
What the faq I c?
What the faq I c?You c the C, faq!
чтобы прибавление разумных величин приводило к невалидному для записи адресунадо еще помнить, что в C++ бывают отрицания, а не только добавления.
для мультинаследованного объекта каст к предку может приводить к изменению указателю на отрицательную величину.
например, под win9x - это приводило к порче уже памяти винды, т.к 0-n = 0xfff..., а эти адреса зарезервированы под винду, но доступно всем.
Если ты хочешь сказать, что в плюсах if (NULL) и if (!NULL) определены не так, как в С, и необязательно ведут себя ожидаемо если NULL != 0, потрудись обосновать, например.
Мне почему-то кажется, что из той статьи следует, что NULL == 0
Следует конечно же, я имел в виду, что `void * ptr = 0; if (*(int*)ptr == 0) { ... }` не обязательно выполнится. Тем не менее, КОНТРА ДОПУСТИЛ ФАКТИЧЕСКУЮ ОШИБКУ и я его поймал на этом!11 А вы все его сокпаппеты и пытаетесь скрыть этот факт!1
КОНТРА ДОПУСТИЛ ФАКТИЧЕСКУЮ ОШИБКУ и я его поймал на этом!11 А вы все его сокпаппеты и пытаетесь скрыть этот факт!1На самом деле для меня его утверждение стало сюрпризом, конечно, но луркать было неохота. Удивило лишь то, что кода if(!p) видел просто тонны. А у нас в фирме так и вообще запрещают писать NULL, обязывают явно сравнивать с 0 (нулем).
Но кстати, по той твоей ссылке в самом вопросе пишут про ненулевой NULL, но в ответе этот момент аккуратно обходится. Т.е. прямо там не утверждается, что NULL == 0, но и не отрицается прямо, отрицается лишь косвенно.
Удивило лишь то, что кода if(!p) видел просто тонныполучается есть три разных высказывания для проверки указателя на валидность:
p != NULL
!p
p != 0
для случая NULL != 0 высказывание !p может быть определено, как:
!p <=> p != 0
!p <=> p != NULL
соответственно, если оно определенно как p != NULL, то код: if (!p) - будет корректным и для случая, когда null != 0
в трэд призываются телепатытелепаты в отпуске
if (p) тоже много видел.
if (p) тоже много видел.так оно тоже может определятся, как p == NULL
надо еще помнить, что в C++ бывают отрицания, а не только добавления.Кому придёт в голову делать левый каст из только что выделенной памяти?
0-n = 0xfff..., а эти адреса зарезервированы под винду, но доступно всем.И часто сейчас приходится поддерживать эту недо-ОС?
Потому что преобразование к инту становится необратимым.
Оставить комментарий
ithtcgth
пользуюсь потоками ifstream и ofstream. И если да, то каковы эти времена и влияния? И как максимально быстро очистить файл?