суббота, 20 марта 2010 г.

Windows: много файлов в одной папке

Решил из любопытства повторить вот этот опыт с максимальным числом открытых файлов в Windows.

Создал скрипт, начал генерить файлы:

(module "crypto.lsp")
(make-dir "c:/tmp/testdir")
(change-dir "c:/tmp/testdir")

(define (rand-2k)
(join (map (fn (x) (append (string x) ": " (join
(map string (rand 10 50))))) (sequence 0 37)) "\n"))

(time (dotimes (x 10000)
(write-file (append (crypto:md5 (string (random))) ".txt") (rand-2k))))
(time (dotimes (x 90000)
(write-file (append (crypto:md5 (string (random))) ".txt") (rand-2k))))


Первые десять тысяч файлов генерировались 123 секунды. Следующие 90 тысяч файлов -- уже 1615 секунд.

Скорость работы, в целом, меня устроила.

Получить список всех файлов в папке через (directory) —- 0.1 секунды
Отобрать 200 файлов и прочесть их -- те же 0.1 секунды.
Сделать то же самое командой "dir" -- примерно столько же.
Прочесть файл из папки -- 0 миллисекунд (!).

И всё бы ничего, да вот только, блджад, dir показал, что у меня в папке 31 169 файлов! Я вначале даже подумал было, что это предел. Однако краткое расследование показало, что это не предел, во всём виноват генератор случайных чисел.

Вот здесь:
http://www.oszone.ru/1296/
http://forum.searchengines.ru/showthread.php?t=290056

пишут, что число файлов в некорневой папке неограничено и может достигать 25 миллионов...

Для продолжения эксперимента оставлю как-нибудь компьютер на ночь создавать файлы безо всяких md5, просто по номерам (sequence 1 500000). Если предположить, что скорость не будет меняться значительно, это должно занять несколько часов. Посмотрим, как поведёт себя Windows в равных условиях, а не на детских 32k файлов.

Кстати, del. удалил эти файлы за 20 секунд.

--- Продолжение ---

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

На ста тысячах скорость была более-менее, но уже не фонтан.

--- Продолжение ---

Сделал скриптом из-под Ubuntu миллион файлов. Скрипт работал примерно 40 минут, жёсткий диск при этом практически не было слышно. Вроде бы -- та же папка, та же файловая система... Интересно, почему так? Возможно, Ubuntu просто пишет на диск не после каждого файла, а раз в несколько секунд?

После перезагрузки обратно в Windows начал тестировать производительность. Она, сразу скажу, меня не очень порадовала (время newLISP выдаёт в миллисекундах):

> (time (directory "."))
13906,25
> (time (directory "."))
2343,75
> (time (directory "." "7.*"))
2187,5
> (length (directory "." "7.*"))
468559
> (length (directory "." "777.*"))
1999
> (time (map read-file (directory "." "777.*")))
36406,25
> (time (read-file "123_456.txt"))
31,25
> (time (read-file "123_456.txt"))
0
> (time (read-file "234_567.txt"))
15,625
> (time (read-file "345_678.txt"))
15,625


13 секунд чтобы получить список файлов в папке первый раз, 2 секунды на каждое последующее обращение к списку файлов. В целом, терпимо.

36 секунд на прочесть 2 000 файлов -- тоже, в общем, сойдёт. Получается всего лишь 18 миллисекунд на файл.

Забавно, что повторное чтение файла занимает 0 миллисекунд. Правда, я не знаю, как именно считает скорость newLISP. Подозреваю, что значениям меньше миллисекунды верить не стоит.

Комментариев нет:

Отправить комментарий

Архив блога