Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.32 KB | None | 0 0
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "raw",
  5. "metadata": {},
  6. "source": [
  7. "Пожалуйста, выполните небольшое задание. Напишите функцию — аналог команды du. Функция должна иметь один параметр — путь к каталогу — и возвращать сумму размеров всех файлов в этом каталоге, включая файлы во вложенных каталогах. Представьте, что вы запустили полученную функцию и команду du в одном и том же каталоге. Функция возвратила большее число, чем команда du. Почему так могло получиться? Как это исправить?"
  8. ]
  9. },
  10. {
  11. "cell_type": "markdown",
  12. "metadata": {},
  13. "source": [
  14. "Начнем с того, что \"размер файла\" и \"место, занимаемое файлом на диске\" - это в общем случае не одно и то же. \n",
  15. "\"Размером файла\" обычно называют собственно количество байт в файле. Пусть у нас есть файл `F.txt` размером FS = 15 КБ. \n",
  16. "\n",
  17. "Диск обычно разделен на блоки некоторого фиксированного размера; один и тот же блок не может быть \"поделен\" между двумя \"хозяевами\"-файлами. Пусть размер блока на нашем диске 4КБ.\n",
  18. "Наш файл F, очевидно, потребует минимум 4 блока на диске (т.к. `3 x 4 = 12 < 15`), т.е. при собственном размере в 15 КБ он займет не менее 16 КБ. Обозначим размер занятого места за DS.\n",
  19. "\n",
  20. "Теперь непосредственно к команде `du`. Вызов **`du F.txt`** без дополнительных ключей вернёт число `(DS / 1024)`, т.е. (округлённый) размер занятого места на диске в КБ. Собственный размер файла (в байтах) можно узнать с ключом `--apparent-size:` **`du --apparent-size F.txt`**. В результате должны получить число `FS`. \n",
  21. "\n",
  22. "Тонким моментом является работа с разреженными (`sparse`) файлами, у которых собственный (`apparent`) размер может быть больше, чем размер на диске. Это происходит от того, что разреженные файлы содержат участки с последоватальностями нулей, которые файловая система не записывает на диск, но сохраняет информацию о том, где они расположены в файле.\n",
  23. "\n",
  24. "Напишем на питоне (2.7) функцию, рекурсивно проходящуюся по всем вложенным директориям и возвращающую суммарный размер файлов. Пустая директория тоже занимает место на диске (размер 1 блока) . Библиотека `os` позволяет узнать как собственный размер файла, так и занимаемый размер на диске."
  25. ]
  26. },
  27. {
  28. "cell_type": "code",
  29. "execution_count": 241,
  30. "metadata": {
  31. "collapsed": true
  32. },
  33. "outputs": [],
  34. "source": [
  35. "import os"
  36. ]
  37. },
  38. {
  39. "cell_type": "markdown",
  40. "metadata": {},
  41. "source": [
  42. "Напишем 2 функции: \n",
  43. "+ `getFileSize()` для определения размера файла\n",
  44. "+ `getDirSize()` для определения размера директории"
  45. ]
  46. },
  47. {
  48. "cell_type": "code",
  49. "execution_count": 242,
  50. "metadata": {
  51. "collapsed": true
  52. },
  53. "outputs": [],
  54. "source": [
  55. "def getFileSize(filename):\n",
  56. " \n",
  57. " stats = os.stat(filename)\n",
  58. " \n",
  59. " # получение собственного размера файла\n",
  60. " fs = stats.st_size\n",
  61. " \n",
  62. " # получение занятого места на диске: (число блоков по 512 байт) х 512 \n",
  63. " fs_d = stats.st_blocks * 512\n",
  64. " \n",
  65. " # возвращаем размеры в байтах\n",
  66. " return (fs, fs_d) \n",
  67. "\n",
  68. "def getDirSize(path, ondisk=True):\n",
  69. " \n",
  70. " size = 0\n",
  71. " ondisk = int(ondisk)\n",
  72. " \n",
  73. " # размер пустой директории\n",
  74. " dirsize = 4096\n",
  75. " \n",
  76. " # цикл по всем поддиректориям\n",
  77. " for root, subdirs, files in os.walk(path):\n",
  78. " size_cur = dirsize + sum([getFileSize(root + '/' + f)[ondisk] for f in files])\n",
  79. " size += size_cur\n",
  80. " \n",
  81. " # возвращаем размер в байтах\n",
  82. " return size"
  83. ]
  84. },
  85. {
  86. "cell_type": "markdown",
  87. "metadata": {},
  88. "source": [
  89. "Проверим работу getFileSize() на тестовом документе:"
  90. ]
  91. },
  92. {
  93. "cell_type": "code",
  94. "execution_count": 243,
  95. "metadata": {},
  96. "outputs": [
  97. {
  98. "data": {
  99. "text/plain": [
  100. "(30, 4096)"
  101. ]
  102. },
  103. "execution_count": 243,
  104. "metadata": {},
  105. "output_type": "execute_result"
  106. }
  107. ],
  108. "source": [
  109. "getFileSize(\"/data/test_dir/test_txt\")"
  110. ]
  111. },
  112. {
  113. "cell_type": "code",
  114. "execution_count": 244,
  115. "metadata": {},
  116. "outputs": [
  117. {
  118. "name": "stdout",
  119. "output_type": "stream",
  120. "text": [
  121. "30\t/data/test_dir/test_txt\n",
  122. "4096\t/data/test_dir/test_txt\n"
  123. ]
  124. }
  125. ],
  126. "source": [
  127. "!du --apparent-size -B1 /data/test_dir/test_txt\n",
  128. "!du -B1 /data/test_dir/test_txt"
  129. ]
  130. },
  131. {
  132. "cell_type": "markdown",
  133. "metadata": {},
  134. "source": [
  135. "Проверим работу getDirSize() на тестовой директории:"
  136. ]
  137. },
  138. {
  139. "cell_type": "code",
  140. "execution_count": 245,
  141. "metadata": {},
  142. "outputs": [
  143. {
  144. "name": "stdout",
  145. "output_type": "stream",
  146. "text": [
  147. "20538\n"
  148. ]
  149. }
  150. ],
  151. "source": [
  152. "print getDirSize(\"/data/test_dir/\", ondisk=False)"
  153. ]
  154. },
  155. {
  156. "cell_type": "code",
  157. "execution_count": 246,
  158. "metadata": {},
  159. "outputs": [
  160. {
  161. "name": "stdout",
  162. "output_type": "stream",
  163. "text": [
  164. "4110\t/data/test_dir/test_subdir_1/test_subdir_3\r\n",
  165. "8220\t/data/test_dir/test_subdir_1\r\n",
  166. "4096\t/data/test_dir/test_subdir_2/.hidden_test_subdir\r\n",
  167. "8192\t/data/test_dir/test_subdir_2\r\n",
  168. "20538\t/data/test_dir/\r\n"
  169. ]
  170. }
  171. ],
  172. "source": [
  173. "!du --apparent-size -B1 /data/test_dir/"
  174. ]
  175. },
  176. {
  177. "cell_type": "code",
  178. "execution_count": 247,
  179. "metadata": {},
  180. "outputs": [
  181. {
  182. "name": "stdout",
  183. "output_type": "stream",
  184. "text": [
  185. "32768\n"
  186. ]
  187. }
  188. ],
  189. "source": [
  190. "print getDirSize(\"/data/test_dir/\", ondisk=True)"
  191. ]
  192. },
  193. {
  194. "cell_type": "code",
  195. "execution_count": 248,
  196. "metadata": {},
  197. "outputs": [
  198. {
  199. "name": "stdout",
  200. "output_type": "stream",
  201. "text": [
  202. "8192\t/data/test_dir/test_subdir_1/test_subdir_3\r\n",
  203. "16384\t/data/test_dir/test_subdir_1\r\n",
  204. "4096\t/data/test_dir/test_subdir_2/.hidden_test_subdir\r\n",
  205. "8192\t/data/test_dir/test_subdir_2\r\n",
  206. "32768\t/data/test_dir/\r\n"
  207. ]
  208. }
  209. ],
  210. "source": [
  211. "!du -B1 /data/test_dir/"
  212. ]
  213. }
  214. ],
  215. "metadata": {
  216. "anaconda-cloud": {},
  217. "kernelspec": {
  218. "display_name": "Python [conda root]",
  219. "language": "python",
  220. "name": "conda-root-py"
  221. },
  222. "language_info": {
  223. "codemirror_mode": {
  224. "name": "ipython",
  225. "version": 2
  226. },
  227. "file_extension": ".py",
  228. "mimetype": "text/x-python",
  229. "name": "python",
  230. "nbconvert_exporter": "python",
  231. "pygments_lexer": "ipython2",
  232. "version": "2.7.12"
  233. }
  234. },
  235. "nbformat": 4,
  236. "nbformat_minor": 1
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement