Как быстрее всего рассчитать использование дискового пространства для каждого клиента?

Я надеюсь, что это простой.

Я запускаю веб-приложение Rails, где размещаю около 100 школьных веб-сайтов. Одно приложение обрабатывает все сайты, и у меня есть интерфейс управления, где мы можем добавлять и удалять школы и т. д.

Я хочу добавить в этот интерфейс статистику, которая представляет собой общее дисковое пространство, используемое этой школой. Файлы каждой школы хранятся в отдельной структуре каталогов, поэтому их легко найти. Единственная проблема в том, что мне нужно, чтобы это было быстро. Итак, вопрос в том, как быстрее всего найти эту информацию. Если бы его можно было найти с помощью вызова ruby ​​​​на лету, это было бы здорово, но я открыт для всего, что сработает. В идеале я хотел бы избежать необходимости кешировать и генерировать эти данные в фоновом режиме (по крайней мере, на уровне рельсов). :)


person Brendon Muir    schedule 02.09.2010    source источник


Ответы (3)


Если вы хотите использовать чистый Ruby, вы можете попробовать этот код. Хотя, если вам нужна скорость, я уверен, что du будет быстрее.

def dir_size(dir_path)
  require 'find'
  size = 0
  Find.find(dir_path) { |f| size += File.size(f) if File.file?(f) }
  size
end

dir_size('/tmp/')
person aNoble    schedule 03.09.2010
comment
Кажется, это стандартный способ вычисления размера и, безусловно, самый простой, если вы хотите быстро получить результаты в Ruby. Это довольно быстро, хотя я запланирую это один раз в день в ранние часы. - person Brendon Muir; 06.09.2010

Вы пробовали просто запускать du в каждом каталоге по запросу? На моем устаревшем компьютере я могу сделать du для каталога размером 15 МБ за ~ 4 мс и 250 МБ за ~ 50 мс. Оба они кажутся разумными для поставленной задачи. Насколько велики каталоги? Прежде чем вы попытаетесь действительно оптимизировать это, убедитесь, что это действительно стоит вашего времени. ЯГНИ и все такое.

Вы всегда можете отслеживать загрузку, когда они предоставят вам файл. Таким образом, вам просто нужно отслеживать дельту по мере добавления или удаления файлов.

person Paul Rubel    schedule 02.09.2010
comment
Я согласен. И делайте расчет только один раз за ночь, или час, или что-то в этом роде. Это, конечно, не звучит так, как будто это критично и должно быть абсолютно последовательным. - person Kaleb Pederson; 03.09.2010
comment
Правильно, это только для случайной проверки. Я попробую запустить du в одной из больших папок и посмотрю, как быстро она работает :) - person Brendon Muir; 03.09.2010
comment
Разве скорость du не должна зависеть исключительно от количества каталогов и файлов? Поскольку размер файлов сохраняется в файловой системе, не имеет значения, имеет размер файл 4 КБ или 100 ГБ. (Пожалуйста, поправьте меня, если я ошибаюсь, что, как я подозреваю, может быть) - person Hubro; 07.10.2015

person    schedule
comment
du может блокироваться, если файл является каналом. - person jmoody; 05.10.2015