From c4df16bcbc7e9912ceeb304f56b575a7d374963f Mon Sep 17 00:00:00 2001 From: Dave McKay Date: Fri, 11 Oct 2024 13:23:21 +0100 Subject: [PATCH] 71 collate at pp folder (#73) * possible solution * fixed removal of existing objects from collation phase * syntax fix * reverse reduce to_collate * infinite loop :/ * working level n collation * gets worse before it gets better * progress * nightly * reverse collation working * done * zip exclusion * debugging * . * . * . * try fire_and_forget * try rebalance * . * if >80% mem used in any worker, wait on zip futures * all working, but can timeout - restart works * pass zip upload futures to mem_check * log zip result by object name * broadcast to_collate * done --- csd3-side/scripts/agg.py | 36 + csd3-side/scripts/deleteme.ipynb | 2246 ++++++++++++++++++++++++++++++ csd3-side/scripts/lsst-backup.py | 572 ++++---- 3 files changed, 2618 insertions(+), 236 deletions(-) create mode 100644 csd3-side/scripts/agg.py create mode 100644 csd3-side/scripts/deleteme.ipynb diff --git a/csd3-side/scripts/agg.py b/csd3-side/scripts/agg.py new file mode 100644 index 0000000..464c361 --- /dev/null +++ b/csd3-side/scripts/agg.py @@ -0,0 +1,36 @@ +a = [1, 2, 1, 2, 2, 1, 1] +b = [['a'], ['b'], ['c'], ['d'], ['e'], ['f'], ['g']] +m = 3 + +at = [] +bt = [] + +current_sum = 0 +current_list = [] + +for i in range(len(a)): + while a[i] > 0: + if current_sum + a[i] <= m: + current_sum += a[i] + current_list.extend(b[i]) + a[i] = 0 + else: + remaining = m - current_sum + current_sum += remaining + current_list.extend(b[i][:remaining]) + b[i] = b[i][remaining:] + a[i] -= remaining + + if current_sum <= m: + at.append(current_sum) + bt.append(current_list) + current_sum = 0 + current_list = [] + +# Handle any remaining values if the last sum didn't reach m +if current_sum > 0: + at.append(current_sum) + bt.append(current_list) + +print("at:", at) +print("bt:", bt) \ No newline at end of file diff --git a/csd3-side/scripts/deleteme.ipynb b/csd3-side/scripts/deleteme.ipynb new file mode 100644 index 0000000..36c671c --- /dev/null +++ b/csd3-side/scripts/deleteme.ipynb @@ -0,0 +1,2246 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from ast import literal_eval" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "log = '/home/dave/test_backup/log'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "dicts = []\n", + "with open(log, 'r') as f:\n", + " for line in f.readlines():\n", + " if line.startswith('to_collate'):\n", + " dstr = ' '.join(line.split()[1:])\n", + " dicts.append(literal_eval(dstr))\n", + " elif line.startswith('TO_COLLATE'):\n", + " dstr = ' '.join(line.split()[1:])\n", + " init_tc = literal_eval(dstr)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "1\n", + "1\n" + ] + } + ], + "source": [ + "for d in dicts:\n", + " print(len(d))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'/home/dave/test_tree/bib/7': {'parent_folder': '/home/dave/test_tree/bib/7',\n", + " 'folders': ['/home/dave/test_tree/bib/7/3',\n", + " '/home/dave/test_tree/bib/7/7',\n", + " '/home/dave/test_tree/bib/7/5',\n", + " '/home/dave/test_tree/bib/7/2',\n", + " '/home/dave/test_tree/bib/7/10',\n", + " '/home/dave/test_tree/bib/7/8',\n", + " '/home/dave/test_tree/bib/7/4',\n", + " '/home/dave/test_tree/bib/7/9',\n", + " '/home/dave/test_tree/bib/7/6',\n", + " '/home/dave/test_tree/bib/7/1'],\n", + " 'object_names': [['test_tree/bib/7/3/3_7.f',\n", + " 'test_tree/bib/7/3/3_9.f',\n", + " 'test_tree/bib/7/3/3_8.f',\n", + " 'test_tree/bib/7/3/3_5.f',\n", + " 'test_tree/bib/7/3/3_6.f',\n", + " 'test_tree/bib/7/3/3_4.f',\n", + " 'test_tree/bib/7/3/3_2.f',\n", + " 'test_tree/bib/7/3/3_3.f',\n", + " 'test_tree/bib/7/3/3_10.f',\n", + " 'test_tree/bib/7/3/3_1.f'],\n", + " ['test_tree/bib/7/7/7_10.f',\n", + " 'test_tree/bib/7/7/7_7.f',\n", + " 'test_tree/bib/7/7/7_6.f',\n", + " 'test_tree/bib/7/7/7_8.f',\n", + " 'test_tree/bib/7/7/7_9.f',\n", + " 'test_tree/bib/7/7/7_3.f',\n", + " 'test_tree/bib/7/7/7_1.f',\n", + " 'test_tree/bib/7/7/7_4.f',\n", + " 'test_tree/bib/7/7/7_2.f',\n", + " 'test_tree/bib/7/7/7_5.f'],\n", + " ['test_tree/bib/7/5/5_9.f',\n", + " 'test_tree/bib/7/5/5_10.f',\n", + " 'test_tree/bib/7/5/5_8.f',\n", + " 'test_tree/bib/7/5/5_1.f',\n", + " 'test_tree/bib/7/5/5_5.f',\n", + " 'test_tree/bib/7/5/5_2.f',\n", + " 'test_tree/bib/7/5/5_6.f',\n", + " 'test_tree/bib/7/5/5_3.f',\n", + " 'test_tree/bib/7/5/5_4.f',\n", + " 'test_tree/bib/7/5/5_7.f'],\n", + " ['test_tree/bib/7/2/2_6.f',\n", + " 'test_tree/bib/7/2/2_1.f',\n", + " 'test_tree/bib/7/2/2_9.f',\n", + " 'test_tree/bib/7/2/2_2.f',\n", + " 'test_tree/bib/7/2/2_10.f',\n", + " 'test_tree/bib/7/2/2_5.f',\n", + " 'test_tree/bib/7/2/2_4.f',\n", + " 'test_tree/bib/7/2/2_3.f',\n", + " 'test_tree/bib/7/2/2_7.f',\n", + " 'test_tree/bib/7/2/2_8.f'],\n", + " ['test_tree/bib/7/10/10_10.f',\n", + " 'test_tree/bib/7/10/10_8.f',\n", + " 'test_tree/bib/7/10/10_3.f',\n", + " 'test_tree/bib/7/10/10_4.f',\n", + " 'test_tree/bib/7/10/10_1.f',\n", + " 'test_tree/bib/7/10/10_9.f',\n", + " 'test_tree/bib/7/10/10_6.f',\n", + " 'test_tree/bib/7/10/10_7.f',\n", + " 'test_tree/bib/7/10/10_5.f',\n", + " 'test_tree/bib/7/10/10_2.f'],\n", + " ['test_tree/bib/7/8/8_2.f',\n", + " 'test_tree/bib/7/8/8_8.f',\n", + " 'test_tree/bib/7/8/8_9.f',\n", + " 'test_tree/bib/7/8/8_7.f',\n", + " 'test_tree/bib/7/8/8_4.f',\n", + " 'test_tree/bib/7/8/8_1.f',\n", + " 'test_tree/bib/7/8/8_3.f',\n", + " 'test_tree/bib/7/8/8_10.f',\n", + " 'test_tree/bib/7/8/8_6.f',\n", + " 'test_tree/bib/7/8/8_5.f'],\n", + " ['test_tree/bib/7/4/4_5.f',\n", + " 'test_tree/bib/7/4/4_7.f',\n", + " 'test_tree/bib/7/4/4_4.f',\n", + " 'test_tree/bib/7/4/4_6.f',\n", + " 'test_tree/bib/7/4/4_8.f',\n", + " 'test_tree/bib/7/4/4_3.f',\n", + " 'test_tree/bib/7/4/4_9.f',\n", + " 'test_tree/bib/7/4/4_2.f',\n", + " 'test_tree/bib/7/4/4_10.f',\n", + " 'test_tree/bib/7/4/4_1.f'],\n", + " ['test_tree/bib/7/9/9_4.f',\n", + " 'test_tree/bib/7/9/9_5.f',\n", + " 'test_tree/bib/7/9/9_8.f',\n", + " 'test_tree/bib/7/9/9_7.f',\n", + " 'test_tree/bib/7/9/9_6.f',\n", + " 'test_tree/bib/7/9/9_1.f',\n", + " 'test_tree/bib/7/9/9_10.f',\n", + " 'test_tree/bib/7/9/9_2.f',\n", + " 'test_tree/bib/7/9/9_3.f',\n", + " 'test_tree/bib/7/9/9_9.f'],\n", + " ['test_tree/bib/7/6/6_6.f',\n", + " 'test_tree/bib/7/6/6_4.f',\n", + " 'test_tree/bib/7/6/6_3.f',\n", + " 'test_tree/bib/7/6/6_5.f',\n", + " 'test_tree/bib/7/6/6_8.f',\n", + " 'test_tree/bib/7/6/6_1.f',\n", + " 'test_tree/bib/7/6/6_10.f',\n", + " 'test_tree/bib/7/6/6_9.f',\n", + " 'test_tree/bib/7/6/6_7.f',\n", + " 'test_tree/bib/7/6/6_2.f'],\n", + " ['test_tree/bib/7/1/1_6.f',\n", + " 'test_tree/bib/7/1/1_9.f',\n", + " 'test_tree/bib/7/1/1_10.f',\n", + " 'test_tree/bib/7/1/1_1.f',\n", + " 'test_tree/bib/7/1/1_3.f',\n", + " 'test_tree/bib/7/1/1_7.f',\n", + " 'test_tree/bib/7/1/1_5.f',\n", + " 'test_tree/bib/7/1/1_2.f',\n", + " 'test_tree/bib/7/1/1_4.f',\n", + " 'test_tree/bib/7/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bib/7/3/3_7.f',\n", + " '/home/dave/test_tree/bib/7/3/3_9.f',\n", + " '/home/dave/test_tree/bib/7/3/3_8.f',\n", + " '/home/dave/test_tree/bib/7/3/3_5.f',\n", + " '/home/dave/test_tree/bib/7/3/3_6.f',\n", + " '/home/dave/test_tree/bib/7/3/3_4.f',\n", + " '/home/dave/test_tree/bib/7/3/3_2.f',\n", + " '/home/dave/test_tree/bib/7/3/3_3.f',\n", + " '/home/dave/test_tree/bib/7/3/3_10.f',\n", + " '/home/dave/test_tree/bib/7/3/3_1.f'],\n", + " ['/home/dave/test_tree/bib/7/7/7_10.f',\n", + " '/home/dave/test_tree/bib/7/7/7_7.f',\n", + " '/home/dave/test_tree/bib/7/7/7_6.f',\n", + " '/home/dave/test_tree/bib/7/7/7_8.f',\n", + " '/home/dave/test_tree/bib/7/7/7_9.f',\n", + " '/home/dave/test_tree/bib/7/7/7_3.f',\n", + " '/home/dave/test_tree/bib/7/7/7_1.f',\n", + " '/home/dave/test_tree/bib/7/7/7_4.f',\n", + " '/home/dave/test_tree/bib/7/7/7_2.f',\n", + " '/home/dave/test_tree/bib/7/7/7_5.f'],\n", + " ['/home/dave/test_tree/bib/7/5/5_9.f',\n", + " '/home/dave/test_tree/bib/7/5/5_10.f',\n", + " '/home/dave/test_tree/bib/7/5/5_8.f',\n", + " '/home/dave/test_tree/bib/7/5/5_1.f',\n", + " '/home/dave/test_tree/bib/7/5/5_5.f',\n", + " '/home/dave/test_tree/bib/7/5/5_2.f',\n", + " '/home/dave/test_tree/bib/7/5/5_6.f',\n", + " '/home/dave/test_tree/bib/7/5/5_3.f',\n", + " '/home/dave/test_tree/bib/7/5/5_4.f',\n", + " '/home/dave/test_tree/bib/7/5/5_7.f'],\n", + " ['/home/dave/test_tree/bib/7/2/2_6.f',\n", + " '/home/dave/test_tree/bib/7/2/2_1.f',\n", + " '/home/dave/test_tree/bib/7/2/2_9.f',\n", + " '/home/dave/test_tree/bib/7/2/2_2.f',\n", + " '/home/dave/test_tree/bib/7/2/2_10.f',\n", + " '/home/dave/test_tree/bib/7/2/2_5.f',\n", + " '/home/dave/test_tree/bib/7/2/2_4.f',\n", + " '/home/dave/test_tree/bib/7/2/2_3.f',\n", + " '/home/dave/test_tree/bib/7/2/2_7.f',\n", + " '/home/dave/test_tree/bib/7/2/2_8.f'],\n", + " ['/home/dave/test_tree/bib/7/10/10_10.f',\n", + " '/home/dave/test_tree/bib/7/10/10_8.f',\n", + " '/home/dave/test_tree/bib/7/10/10_3.f',\n", + " '/home/dave/test_tree/bib/7/10/10_4.f',\n", + " '/home/dave/test_tree/bib/7/10/10_1.f',\n", + " '/home/dave/test_tree/bib/7/10/10_9.f',\n", + " '/home/dave/test_tree/bib/7/10/10_6.f',\n", + " '/home/dave/test_tree/bib/7/10/10_7.f',\n", + " '/home/dave/test_tree/bib/7/10/10_5.f',\n", + " '/home/dave/test_tree/bib/7/10/10_2.f'],\n", + " ['/home/dave/test_tree/bib/7/8/8_2.f',\n", + " '/home/dave/test_tree/bib/7/8/8_8.f',\n", + " '/home/dave/test_tree/bib/7/8/8_9.f',\n", + " '/home/dave/test_tree/bib/7/8/8_7.f',\n", + " '/home/dave/test_tree/bib/7/8/8_4.f',\n", + " '/home/dave/test_tree/bib/7/8/8_1.f',\n", + " '/home/dave/test_tree/bib/7/8/8_3.f',\n", + " '/home/dave/test_tree/bib/7/8/8_10.f',\n", + " '/home/dave/test_tree/bib/7/8/8_6.f',\n", + " '/home/dave/test_tree/bib/7/8/8_5.f'],\n", + " ['/home/dave/test_tree/bib/7/4/4_5.f',\n", + " '/home/dave/test_tree/bib/7/4/4_7.f',\n", + " '/home/dave/test_tree/bib/7/4/4_4.f',\n", + " '/home/dave/test_tree/bib/7/4/4_6.f',\n", + " '/home/dave/test_tree/bib/7/4/4_8.f',\n", + " '/home/dave/test_tree/bib/7/4/4_3.f',\n", + " '/home/dave/test_tree/bib/7/4/4_9.f',\n", + " '/home/dave/test_tree/bib/7/4/4_2.f',\n", + " '/home/dave/test_tree/bib/7/4/4_10.f',\n", + " '/home/dave/test_tree/bib/7/4/4_1.f'],\n", + " ['/home/dave/test_tree/bib/7/9/9_4.f',\n", + " '/home/dave/test_tree/bib/7/9/9_5.f',\n", + " '/home/dave/test_tree/bib/7/9/9_8.f',\n", + " '/home/dave/test_tree/bib/7/9/9_7.f',\n", + " '/home/dave/test_tree/bib/7/9/9_6.f',\n", + " '/home/dave/test_tree/bib/7/9/9_1.f',\n", + " '/home/dave/test_tree/bib/7/9/9_10.f',\n", + " '/home/dave/test_tree/bib/7/9/9_2.f',\n", + " '/home/dave/test_tree/bib/7/9/9_3.f',\n", + " '/home/dave/test_tree/bib/7/9/9_9.f'],\n", + " ['/home/dave/test_tree/bib/7/6/6_6.f',\n", + " '/home/dave/test_tree/bib/7/6/6_4.f',\n", + " '/home/dave/test_tree/bib/7/6/6_3.f',\n", + " '/home/dave/test_tree/bib/7/6/6_5.f',\n", + " '/home/dave/test_tree/bib/7/6/6_8.f',\n", + " '/home/dave/test_tree/bib/7/6/6_1.f',\n", + " '/home/dave/test_tree/bib/7/6/6_10.f',\n", + " '/home/dave/test_tree/bib/7/6/6_9.f',\n", + " '/home/dave/test_tree/bib/7/6/6_7.f',\n", + " '/home/dave/test_tree/bib/7/6/6_2.f'],\n", + " ['/home/dave/test_tree/bib/7/1/1_6.f',\n", + " '/home/dave/test_tree/bib/7/1/1_9.f',\n", + " '/home/dave/test_tree/bib/7/1/1_10.f',\n", + " '/home/dave/test_tree/bib/7/1/1_1.f',\n", + " '/home/dave/test_tree/bib/7/1/1_3.f',\n", + " '/home/dave/test_tree/bib/7/1/1_7.f',\n", + " '/home/dave/test_tree/bib/7/1/1_5.f',\n", + " '/home/dave/test_tree/bib/7/1/1_2.f',\n", + " '/home/dave/test_tree/bib/7/1/1_4.f',\n", + " '/home/dave/test_tree/bib/7/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bib',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bib/10': {'parent_folder': '/home/dave/test_tree/bib/10',\n", + " 'folders': ['/home/dave/test_tree/bib/10/3',\n", + " '/home/dave/test_tree/bib/10/7',\n", + " '/home/dave/test_tree/bib/10/5',\n", + " '/home/dave/test_tree/bib/10/2',\n", + " '/home/dave/test_tree/bib/10/10',\n", + " '/home/dave/test_tree/bib/10/8',\n", + " '/home/dave/test_tree/bib/10/4',\n", + " '/home/dave/test_tree/bib/10/9',\n", + " '/home/dave/test_tree/bib/10/6',\n", + " '/home/dave/test_tree/bib/10/1'],\n", + " 'object_names': [['test_tree/bib/10/3/3_7.f',\n", + " 'test_tree/bib/10/3/3_9.f',\n", + " 'test_tree/bib/10/3/3_8.f',\n", + " 'test_tree/bib/10/3/3_5.f',\n", + " 'test_tree/bib/10/3/3_6.f',\n", + " 'test_tree/bib/10/3/3_4.f',\n", + " 'test_tree/bib/10/3/3_2.f',\n", + " 'test_tree/bib/10/3/3_3.f',\n", + " 'test_tree/bib/10/3/3_10.f',\n", + " 'test_tree/bib/10/3/3_1.f'],\n", + " ['test_tree/bib/10/7/7_10.f',\n", + " 'test_tree/bib/10/7/7_7.f',\n", + " 'test_tree/bib/10/7/7_6.f',\n", + " 'test_tree/bib/10/7/7_8.f',\n", + " 'test_tree/bib/10/7/7_9.f',\n", + " 'test_tree/bib/10/7/7_3.f',\n", + " 'test_tree/bib/10/7/7_1.f',\n", + " 'test_tree/bib/10/7/7_4.f',\n", + " 'test_tree/bib/10/7/7_2.f',\n", + " 'test_tree/bib/10/7/7_5.f'],\n", + " ['test_tree/bib/10/5/5_9.f',\n", + " 'test_tree/bib/10/5/5_10.f',\n", + " 'test_tree/bib/10/5/5_8.f',\n", + " 'test_tree/bib/10/5/5_1.f',\n", + " 'test_tree/bib/10/5/5_5.f',\n", + " 'test_tree/bib/10/5/5_2.f',\n", + " 'test_tree/bib/10/5/5_6.f',\n", + " 'test_tree/bib/10/5/5_3.f',\n", + " 'test_tree/bib/10/5/5_4.f',\n", + " 'test_tree/bib/10/5/5_7.f'],\n", + " ['test_tree/bib/10/2/2_6.f',\n", + " 'test_tree/bib/10/2/2_1.f',\n", + " 'test_tree/bib/10/2/2_9.f',\n", + " 'test_tree/bib/10/2/2_2.f',\n", + " 'test_tree/bib/10/2/2_10.f',\n", + " 'test_tree/bib/10/2/2_5.f',\n", + " 'test_tree/bib/10/2/2_4.f',\n", + " 'test_tree/bib/10/2/2_3.f',\n", + " 'test_tree/bib/10/2/2_7.f',\n", + " 'test_tree/bib/10/2/2_8.f'],\n", + " ['test_tree/bib/10/10/10_10.f',\n", + " 'test_tree/bib/10/10/10_8.f',\n", + " 'test_tree/bib/10/10/10_3.f',\n", + " 'test_tree/bib/10/10/10_4.f',\n", + " 'test_tree/bib/10/10/10_1.f',\n", + " 'test_tree/bib/10/10/10_9.f',\n", + " 'test_tree/bib/10/10/10_6.f',\n", + " 'test_tree/bib/10/10/10_7.f',\n", + " 'test_tree/bib/10/10/10_5.f',\n", + " 'test_tree/bib/10/10/10_2.f'],\n", + " ['test_tree/bib/10/8/8_2.f',\n", + " 'test_tree/bib/10/8/8_8.f',\n", + " 'test_tree/bib/10/8/8_9.f',\n", + " 'test_tree/bib/10/8/8_7.f',\n", + " 'test_tree/bib/10/8/8_4.f',\n", + " 'test_tree/bib/10/8/8_1.f',\n", + " 'test_tree/bib/10/8/8_3.f',\n", + " 'test_tree/bib/10/8/8_10.f',\n", + " 'test_tree/bib/10/8/8_6.f',\n", + " 'test_tree/bib/10/8/8_5.f'],\n", + " ['test_tree/bib/10/4/4_5.f',\n", + " 'test_tree/bib/10/4/4_7.f',\n", + " 'test_tree/bib/10/4/4_4.f',\n", + " 'test_tree/bib/10/4/4_6.f',\n", + " 'test_tree/bib/10/4/4_8.f',\n", + " 'test_tree/bib/10/4/4_3.f',\n", + " 'test_tree/bib/10/4/4_9.f',\n", + " 'test_tree/bib/10/4/4_2.f',\n", + " 'test_tree/bib/10/4/4_10.f',\n", + " 'test_tree/bib/10/4/4_1.f'],\n", + " ['test_tree/bib/10/9/9_4.f',\n", + " 'test_tree/bib/10/9/9_5.f',\n", + " 'test_tree/bib/10/9/9_8.f',\n", + " 'test_tree/bib/10/9/9_7.f',\n", + " 'test_tree/bib/10/9/9_6.f',\n", + " 'test_tree/bib/10/9/9_1.f',\n", + " 'test_tree/bib/10/9/9_10.f',\n", + " 'test_tree/bib/10/9/9_2.f',\n", + " 'test_tree/bib/10/9/9_3.f',\n", + " 'test_tree/bib/10/9/9_9.f'],\n", + " ['test_tree/bib/10/6/6_6.f',\n", + " 'test_tree/bib/10/6/6_4.f',\n", + " 'test_tree/bib/10/6/6_3.f',\n", + " 'test_tree/bib/10/6/6_5.f',\n", + " 'test_tree/bib/10/6/6_8.f',\n", + " 'test_tree/bib/10/6/6_1.f',\n", + " 'test_tree/bib/10/6/6_10.f',\n", + " 'test_tree/bib/10/6/6_9.f',\n", + " 'test_tree/bib/10/6/6_7.f',\n", + " 'test_tree/bib/10/6/6_2.f'],\n", + " ['test_tree/bib/10/1/1_6.f',\n", + " 'test_tree/bib/10/1/1_9.f',\n", + " 'test_tree/bib/10/1/1_10.f',\n", + " 'test_tree/bib/10/1/1_1.f',\n", + " 'test_tree/bib/10/1/1_3.f',\n", + " 'test_tree/bib/10/1/1_7.f',\n", + " 'test_tree/bib/10/1/1_5.f',\n", + " 'test_tree/bib/10/1/1_2.f',\n", + " 'test_tree/bib/10/1/1_4.f',\n", + " 'test_tree/bib/10/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bib/10/3/3_7.f',\n", + " '/home/dave/test_tree/bib/10/3/3_9.f',\n", + " '/home/dave/test_tree/bib/10/3/3_8.f',\n", + " '/home/dave/test_tree/bib/10/3/3_5.f',\n", + " '/home/dave/test_tree/bib/10/3/3_6.f',\n", + " '/home/dave/test_tree/bib/10/3/3_4.f',\n", + " '/home/dave/test_tree/bib/10/3/3_2.f',\n", + " '/home/dave/test_tree/bib/10/3/3_3.f',\n", + " '/home/dave/test_tree/bib/10/3/3_10.f',\n", + " '/home/dave/test_tree/bib/10/3/3_1.f'],\n", + " ['/home/dave/test_tree/bib/10/7/7_10.f',\n", + " '/home/dave/test_tree/bib/10/7/7_7.f',\n", + " '/home/dave/test_tree/bib/10/7/7_6.f',\n", + " '/home/dave/test_tree/bib/10/7/7_8.f',\n", + " '/home/dave/test_tree/bib/10/7/7_9.f',\n", + " '/home/dave/test_tree/bib/10/7/7_3.f',\n", + " '/home/dave/test_tree/bib/10/7/7_1.f',\n", + " '/home/dave/test_tree/bib/10/7/7_4.f',\n", + " '/home/dave/test_tree/bib/10/7/7_2.f',\n", + " '/home/dave/test_tree/bib/10/7/7_5.f'],\n", + " ['/home/dave/test_tree/bib/10/5/5_9.f',\n", + " '/home/dave/test_tree/bib/10/5/5_10.f',\n", + " '/home/dave/test_tree/bib/10/5/5_8.f',\n", + " '/home/dave/test_tree/bib/10/5/5_1.f',\n", + " '/home/dave/test_tree/bib/10/5/5_5.f',\n", + " '/home/dave/test_tree/bib/10/5/5_2.f',\n", + " '/home/dave/test_tree/bib/10/5/5_6.f',\n", + " '/home/dave/test_tree/bib/10/5/5_3.f',\n", + " '/home/dave/test_tree/bib/10/5/5_4.f',\n", + " '/home/dave/test_tree/bib/10/5/5_7.f'],\n", + " ['/home/dave/test_tree/bib/10/2/2_6.f',\n", + " '/home/dave/test_tree/bib/10/2/2_1.f',\n", + " '/home/dave/test_tree/bib/10/2/2_9.f',\n", + " '/home/dave/test_tree/bib/10/2/2_2.f',\n", + " '/home/dave/test_tree/bib/10/2/2_10.f',\n", + " '/home/dave/test_tree/bib/10/2/2_5.f',\n", + " '/home/dave/test_tree/bib/10/2/2_4.f',\n", + " '/home/dave/test_tree/bib/10/2/2_3.f',\n", + " '/home/dave/test_tree/bib/10/2/2_7.f',\n", + " '/home/dave/test_tree/bib/10/2/2_8.f'],\n", + " ['/home/dave/test_tree/bib/10/10/10_10.f',\n", + " '/home/dave/test_tree/bib/10/10/10_8.f',\n", + " '/home/dave/test_tree/bib/10/10/10_3.f',\n", + " '/home/dave/test_tree/bib/10/10/10_4.f',\n", + " '/home/dave/test_tree/bib/10/10/10_1.f',\n", + " '/home/dave/test_tree/bib/10/10/10_9.f',\n", + " '/home/dave/test_tree/bib/10/10/10_6.f',\n", + " '/home/dave/test_tree/bib/10/10/10_7.f',\n", + " '/home/dave/test_tree/bib/10/10/10_5.f',\n", + " '/home/dave/test_tree/bib/10/10/10_2.f'],\n", + " ['/home/dave/test_tree/bib/10/8/8_2.f',\n", + " '/home/dave/test_tree/bib/10/8/8_8.f',\n", + " '/home/dave/test_tree/bib/10/8/8_9.f',\n", + " '/home/dave/test_tree/bib/10/8/8_7.f',\n", + " '/home/dave/test_tree/bib/10/8/8_4.f',\n", + " '/home/dave/test_tree/bib/10/8/8_1.f',\n", + " '/home/dave/test_tree/bib/10/8/8_3.f',\n", + " '/home/dave/test_tree/bib/10/8/8_10.f',\n", + " '/home/dave/test_tree/bib/10/8/8_6.f',\n", + " '/home/dave/test_tree/bib/10/8/8_5.f'],\n", + " ['/home/dave/test_tree/bib/10/4/4_5.f',\n", + " '/home/dave/test_tree/bib/10/4/4_7.f',\n", + " '/home/dave/test_tree/bib/10/4/4_4.f',\n", + " '/home/dave/test_tree/bib/10/4/4_6.f',\n", + " '/home/dave/test_tree/bib/10/4/4_8.f',\n", + " '/home/dave/test_tree/bib/10/4/4_3.f',\n", + " '/home/dave/test_tree/bib/10/4/4_9.f',\n", + " '/home/dave/test_tree/bib/10/4/4_2.f',\n", + " '/home/dave/test_tree/bib/10/4/4_10.f',\n", + " '/home/dave/test_tree/bib/10/4/4_1.f'],\n", + " ['/home/dave/test_tree/bib/10/9/9_4.f',\n", + " '/home/dave/test_tree/bib/10/9/9_5.f',\n", + " '/home/dave/test_tree/bib/10/9/9_8.f',\n", + " '/home/dave/test_tree/bib/10/9/9_7.f',\n", + " '/home/dave/test_tree/bib/10/9/9_6.f',\n", + " '/home/dave/test_tree/bib/10/9/9_1.f',\n", + " '/home/dave/test_tree/bib/10/9/9_10.f',\n", + " '/home/dave/test_tree/bib/10/9/9_2.f',\n", + " '/home/dave/test_tree/bib/10/9/9_3.f',\n", + " '/home/dave/test_tree/bib/10/9/9_9.f'],\n", + " ['/home/dave/test_tree/bib/10/6/6_6.f',\n", + " '/home/dave/test_tree/bib/10/6/6_4.f',\n", + " '/home/dave/test_tree/bib/10/6/6_3.f',\n", + " '/home/dave/test_tree/bib/10/6/6_5.f',\n", + " '/home/dave/test_tree/bib/10/6/6_8.f',\n", + " '/home/dave/test_tree/bib/10/6/6_1.f',\n", + " '/home/dave/test_tree/bib/10/6/6_10.f',\n", + " '/home/dave/test_tree/bib/10/6/6_9.f',\n", + " '/home/dave/test_tree/bib/10/6/6_7.f',\n", + " '/home/dave/test_tree/bib/10/6/6_2.f'],\n", + " ['/home/dave/test_tree/bib/10/1/1_6.f',\n", + " '/home/dave/test_tree/bib/10/1/1_9.f',\n", + " '/home/dave/test_tree/bib/10/1/1_10.f',\n", + " '/home/dave/test_tree/bib/10/1/1_1.f',\n", + " '/home/dave/test_tree/bib/10/1/1_3.f',\n", + " '/home/dave/test_tree/bib/10/1/1_7.f',\n", + " '/home/dave/test_tree/bib/10/1/1_5.f',\n", + " '/home/dave/test_tree/bib/10/1/1_2.f',\n", + " '/home/dave/test_tree/bib/10/1/1_4.f',\n", + " '/home/dave/test_tree/bib/10/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bib',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bib/8': {'parent_folder': '/home/dave/test_tree/bib/8',\n", + " 'folders': ['/home/dave/test_tree/bib/8/3',\n", + " '/home/dave/test_tree/bib/8/7',\n", + " '/home/dave/test_tree/bib/8/5',\n", + " '/home/dave/test_tree/bib/8/2',\n", + " '/home/dave/test_tree/bib/8/10',\n", + " '/home/dave/test_tree/bib/8/8',\n", + " '/home/dave/test_tree/bib/8/4',\n", + " '/home/dave/test_tree/bib/8/9',\n", + " '/home/dave/test_tree/bib/8/6',\n", + " '/home/dave/test_tree/bib/8/1'],\n", + " 'object_names': [['test_tree/bib/8/3/3_7.f',\n", + " 'test_tree/bib/8/3/3_9.f',\n", + " 'test_tree/bib/8/3/3_8.f',\n", + " 'test_tree/bib/8/3/3_5.f',\n", + " 'test_tree/bib/8/3/3_6.f',\n", + " 'test_tree/bib/8/3/3_4.f',\n", + " 'test_tree/bib/8/3/3_2.f',\n", + " 'test_tree/bib/8/3/3_3.f',\n", + " 'test_tree/bib/8/3/3_10.f',\n", + " 'test_tree/bib/8/3/3_1.f'],\n", + " ['test_tree/bib/8/7/7_10.f',\n", + " 'test_tree/bib/8/7/7_7.f',\n", + " 'test_tree/bib/8/7/7_6.f',\n", + " 'test_tree/bib/8/7/7_8.f',\n", + " 'test_tree/bib/8/7/7_9.f',\n", + " 'test_tree/bib/8/7/7_3.f',\n", + " 'test_tree/bib/8/7/7_1.f',\n", + " 'test_tree/bib/8/7/7_4.f',\n", + " 'test_tree/bib/8/7/7_2.f',\n", + " 'test_tree/bib/8/7/7_5.f'],\n", + " ['test_tree/bib/8/5/5_9.f',\n", + " 'test_tree/bib/8/5/5_10.f',\n", + " 'test_tree/bib/8/5/5_8.f',\n", + " 'test_tree/bib/8/5/5_1.f',\n", + " 'test_tree/bib/8/5/5_5.f',\n", + " 'test_tree/bib/8/5/5_2.f',\n", + " 'test_tree/bib/8/5/5_6.f',\n", + " 'test_tree/bib/8/5/5_3.f',\n", + " 'test_tree/bib/8/5/5_4.f',\n", + " 'test_tree/bib/8/5/5_7.f'],\n", + " ['test_tree/bib/8/2/2_6.f',\n", + " 'test_tree/bib/8/2/2_1.f',\n", + " 'test_tree/bib/8/2/2_9.f',\n", + " 'test_tree/bib/8/2/2_2.f',\n", + " 'test_tree/bib/8/2/2_10.f',\n", + " 'test_tree/bib/8/2/2_5.f',\n", + " 'test_tree/bib/8/2/2_4.f',\n", + " 'test_tree/bib/8/2/2_3.f',\n", + " 'test_tree/bib/8/2/2_7.f',\n", + " 'test_tree/bib/8/2/2_8.f'],\n", + " ['test_tree/bib/8/10/10_10.f',\n", + " 'test_tree/bib/8/10/10_8.f',\n", + " 'test_tree/bib/8/10/10_3.f',\n", + " 'test_tree/bib/8/10/10_4.f',\n", + " 'test_tree/bib/8/10/10_1.f',\n", + " 'test_tree/bib/8/10/10_9.f',\n", + " 'test_tree/bib/8/10/10_6.f',\n", + " 'test_tree/bib/8/10/10_7.f',\n", + " 'test_tree/bib/8/10/10_5.f',\n", + " 'test_tree/bib/8/10/10_2.f'],\n", + " ['test_tree/bib/8/8/8_2.f',\n", + " 'test_tree/bib/8/8/8_8.f',\n", + " 'test_tree/bib/8/8/8_9.f',\n", + " 'test_tree/bib/8/8/8_7.f',\n", + " 'test_tree/bib/8/8/8_4.f',\n", + " 'test_tree/bib/8/8/8_1.f',\n", + " 'test_tree/bib/8/8/8_3.f',\n", + " 'test_tree/bib/8/8/8_10.f',\n", + " 'test_tree/bib/8/8/8_6.f',\n", + " 'test_tree/bib/8/8/8_5.f'],\n", + " ['test_tree/bib/8/4/4_5.f',\n", + " 'test_tree/bib/8/4/4_7.f',\n", + " 'test_tree/bib/8/4/4_4.f',\n", + " 'test_tree/bib/8/4/4_6.f',\n", + " 'test_tree/bib/8/4/4_8.f',\n", + " 'test_tree/bib/8/4/4_3.f',\n", + " 'test_tree/bib/8/4/4_9.f',\n", + " 'test_tree/bib/8/4/4_2.f',\n", + " 'test_tree/bib/8/4/4_10.f',\n", + " 'test_tree/bib/8/4/4_1.f'],\n", + " ['test_tree/bib/8/9/9_4.f',\n", + " 'test_tree/bib/8/9/9_5.f',\n", + " 'test_tree/bib/8/9/9_8.f',\n", + " 'test_tree/bib/8/9/9_7.f',\n", + " 'test_tree/bib/8/9/9_6.f',\n", + " 'test_tree/bib/8/9/9_1.f',\n", + " 'test_tree/bib/8/9/9_10.f',\n", + " 'test_tree/bib/8/9/9_2.f',\n", + " 'test_tree/bib/8/9/9_3.f',\n", + " 'test_tree/bib/8/9/9_9.f'],\n", + " ['test_tree/bib/8/6/6_6.f',\n", + " 'test_tree/bib/8/6/6_4.f',\n", + " 'test_tree/bib/8/6/6_3.f',\n", + " 'test_tree/bib/8/6/6_5.f',\n", + " 'test_tree/bib/8/6/6_8.f',\n", + " 'test_tree/bib/8/6/6_1.f',\n", + " 'test_tree/bib/8/6/6_10.f',\n", + " 'test_tree/bib/8/6/6_9.f',\n", + " 'test_tree/bib/8/6/6_7.f',\n", + " 'test_tree/bib/8/6/6_2.f'],\n", + " ['test_tree/bib/8/1/1_6.f',\n", + " 'test_tree/bib/8/1/1_9.f',\n", + " 'test_tree/bib/8/1/1_10.f',\n", + " 'test_tree/bib/8/1/1_1.f',\n", + " 'test_tree/bib/8/1/1_3.f',\n", + " 'test_tree/bib/8/1/1_7.f',\n", + " 'test_tree/bib/8/1/1_5.f',\n", + " 'test_tree/bib/8/1/1_2.f',\n", + " 'test_tree/bib/8/1/1_4.f',\n", + " 'test_tree/bib/8/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bib/8/3/3_7.f',\n", + " '/home/dave/test_tree/bib/8/3/3_9.f',\n", + " '/home/dave/test_tree/bib/8/3/3_8.f',\n", + " '/home/dave/test_tree/bib/8/3/3_5.f',\n", + " '/home/dave/test_tree/bib/8/3/3_6.f',\n", + " '/home/dave/test_tree/bib/8/3/3_4.f',\n", + " '/home/dave/test_tree/bib/8/3/3_2.f',\n", + " '/home/dave/test_tree/bib/8/3/3_3.f',\n", + " '/home/dave/test_tree/bib/8/3/3_10.f',\n", + " '/home/dave/test_tree/bib/8/3/3_1.f'],\n", + " ['/home/dave/test_tree/bib/8/7/7_10.f',\n", + " '/home/dave/test_tree/bib/8/7/7_7.f',\n", + " '/home/dave/test_tree/bib/8/7/7_6.f',\n", + " '/home/dave/test_tree/bib/8/7/7_8.f',\n", + " '/home/dave/test_tree/bib/8/7/7_9.f',\n", + " '/home/dave/test_tree/bib/8/7/7_3.f',\n", + " '/home/dave/test_tree/bib/8/7/7_1.f',\n", + " '/home/dave/test_tree/bib/8/7/7_4.f',\n", + " '/home/dave/test_tree/bib/8/7/7_2.f',\n", + " '/home/dave/test_tree/bib/8/7/7_5.f'],\n", + " ['/home/dave/test_tree/bib/8/5/5_9.f',\n", + " '/home/dave/test_tree/bib/8/5/5_10.f',\n", + " '/home/dave/test_tree/bib/8/5/5_8.f',\n", + " '/home/dave/test_tree/bib/8/5/5_1.f',\n", + " '/home/dave/test_tree/bib/8/5/5_5.f',\n", + " '/home/dave/test_tree/bib/8/5/5_2.f',\n", + " '/home/dave/test_tree/bib/8/5/5_6.f',\n", + " '/home/dave/test_tree/bib/8/5/5_3.f',\n", + " '/home/dave/test_tree/bib/8/5/5_4.f',\n", + " '/home/dave/test_tree/bib/8/5/5_7.f'],\n", + " ['/home/dave/test_tree/bib/8/2/2_6.f',\n", + " '/home/dave/test_tree/bib/8/2/2_1.f',\n", + " '/home/dave/test_tree/bib/8/2/2_9.f',\n", + " '/home/dave/test_tree/bib/8/2/2_2.f',\n", + " '/home/dave/test_tree/bib/8/2/2_10.f',\n", + " '/home/dave/test_tree/bib/8/2/2_5.f',\n", + " '/home/dave/test_tree/bib/8/2/2_4.f',\n", + " '/home/dave/test_tree/bib/8/2/2_3.f',\n", + " '/home/dave/test_tree/bib/8/2/2_7.f',\n", + " '/home/dave/test_tree/bib/8/2/2_8.f'],\n", + " ['/home/dave/test_tree/bib/8/10/10_10.f',\n", + " '/home/dave/test_tree/bib/8/10/10_8.f',\n", + " '/home/dave/test_tree/bib/8/10/10_3.f',\n", + " '/home/dave/test_tree/bib/8/10/10_4.f',\n", + " '/home/dave/test_tree/bib/8/10/10_1.f',\n", + " '/home/dave/test_tree/bib/8/10/10_9.f',\n", + " '/home/dave/test_tree/bib/8/10/10_6.f',\n", + " '/home/dave/test_tree/bib/8/10/10_7.f',\n", + " '/home/dave/test_tree/bib/8/10/10_5.f',\n", + " '/home/dave/test_tree/bib/8/10/10_2.f'],\n", + " ['/home/dave/test_tree/bib/8/8/8_2.f',\n", + " '/home/dave/test_tree/bib/8/8/8_8.f',\n", + " '/home/dave/test_tree/bib/8/8/8_9.f',\n", + " '/home/dave/test_tree/bib/8/8/8_7.f',\n", + " '/home/dave/test_tree/bib/8/8/8_4.f',\n", + " '/home/dave/test_tree/bib/8/8/8_1.f',\n", + " '/home/dave/test_tree/bib/8/8/8_3.f',\n", + " '/home/dave/test_tree/bib/8/8/8_10.f',\n", + " '/home/dave/test_tree/bib/8/8/8_6.f',\n", + " '/home/dave/test_tree/bib/8/8/8_5.f'],\n", + " ['/home/dave/test_tree/bib/8/4/4_5.f',\n", + " '/home/dave/test_tree/bib/8/4/4_7.f',\n", + " '/home/dave/test_tree/bib/8/4/4_4.f',\n", + " '/home/dave/test_tree/bib/8/4/4_6.f',\n", + " '/home/dave/test_tree/bib/8/4/4_8.f',\n", + " '/home/dave/test_tree/bib/8/4/4_3.f',\n", + " '/home/dave/test_tree/bib/8/4/4_9.f',\n", + " '/home/dave/test_tree/bib/8/4/4_2.f',\n", + " '/home/dave/test_tree/bib/8/4/4_10.f',\n", + " '/home/dave/test_tree/bib/8/4/4_1.f'],\n", + " ['/home/dave/test_tree/bib/8/9/9_4.f',\n", + " '/home/dave/test_tree/bib/8/9/9_5.f',\n", + " '/home/dave/test_tree/bib/8/9/9_8.f',\n", + " '/home/dave/test_tree/bib/8/9/9_7.f',\n", + " '/home/dave/test_tree/bib/8/9/9_6.f',\n", + " '/home/dave/test_tree/bib/8/9/9_1.f',\n", + " '/home/dave/test_tree/bib/8/9/9_10.f',\n", + " '/home/dave/test_tree/bib/8/9/9_2.f',\n", + " '/home/dave/test_tree/bib/8/9/9_3.f',\n", + " '/home/dave/test_tree/bib/8/9/9_9.f'],\n", + " ['/home/dave/test_tree/bib/8/6/6_6.f',\n", + " '/home/dave/test_tree/bib/8/6/6_4.f',\n", + " '/home/dave/test_tree/bib/8/6/6_3.f',\n", + " '/home/dave/test_tree/bib/8/6/6_5.f',\n", + " '/home/dave/test_tree/bib/8/6/6_8.f',\n", + " '/home/dave/test_tree/bib/8/6/6_1.f',\n", + " '/home/dave/test_tree/bib/8/6/6_10.f',\n", + " '/home/dave/test_tree/bib/8/6/6_9.f',\n", + " '/home/dave/test_tree/bib/8/6/6_7.f',\n", + " '/home/dave/test_tree/bib/8/6/6_2.f'],\n", + " ['/home/dave/test_tree/bib/8/1/1_6.f',\n", + " '/home/dave/test_tree/bib/8/1/1_9.f',\n", + " '/home/dave/test_tree/bib/8/1/1_10.f',\n", + " '/home/dave/test_tree/bib/8/1/1_1.f',\n", + " '/home/dave/test_tree/bib/8/1/1_3.f',\n", + " '/home/dave/test_tree/bib/8/1/1_7.f',\n", + " '/home/dave/test_tree/bib/8/1/1_5.f',\n", + " '/home/dave/test_tree/bib/8/1/1_2.f',\n", + " '/home/dave/test_tree/bib/8/1/1_4.f',\n", + " '/home/dave/test_tree/bib/8/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bib',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bib/9': {'parent_folder': '/home/dave/test_tree/bib/9',\n", + " 'folders': ['/home/dave/test_tree/bib/9/3',\n", + " '/home/dave/test_tree/bib/9/7',\n", + " '/home/dave/test_tree/bib/9/5',\n", + " '/home/dave/test_tree/bib/9/2',\n", + " '/home/dave/test_tree/bib/9/10',\n", + " '/home/dave/test_tree/bib/9/8',\n", + " '/home/dave/test_tree/bib/9/4',\n", + " '/home/dave/test_tree/bib/9/9',\n", + " '/home/dave/test_tree/bib/9/6',\n", + " '/home/dave/test_tree/bib/9/1'],\n", + " 'object_names': [['test_tree/bib/9/3/3_7.f',\n", + " 'test_tree/bib/9/3/3_9.f',\n", + " 'test_tree/bib/9/3/3_8.f',\n", + " 'test_tree/bib/9/3/3_5.f',\n", + " 'test_tree/bib/9/3/3_6.f',\n", + " 'test_tree/bib/9/3/3_4.f',\n", + " 'test_tree/bib/9/3/3_2.f',\n", + " 'test_tree/bib/9/3/3_3.f',\n", + " 'test_tree/bib/9/3/3_10.f',\n", + " 'test_tree/bib/9/3/3_1.f'],\n", + " ['test_tree/bib/9/7/7_10.f',\n", + " 'test_tree/bib/9/7/7_7.f',\n", + " 'test_tree/bib/9/7/7_6.f',\n", + " 'test_tree/bib/9/7/7_8.f',\n", + " 'test_tree/bib/9/7/7_9.f',\n", + " 'test_tree/bib/9/7/7_3.f',\n", + " 'test_tree/bib/9/7/7_1.f',\n", + " 'test_tree/bib/9/7/7_4.f',\n", + " 'test_tree/bib/9/7/7_2.f',\n", + " 'test_tree/bib/9/7/7_5.f'],\n", + " ['test_tree/bib/9/5/5_9.f',\n", + " 'test_tree/bib/9/5/5_10.f',\n", + " 'test_tree/bib/9/5/5_8.f',\n", + " 'test_tree/bib/9/5/5_1.f',\n", + " 'test_tree/bib/9/5/5_5.f',\n", + " 'test_tree/bib/9/5/5_2.f',\n", + " 'test_tree/bib/9/5/5_6.f',\n", + " 'test_tree/bib/9/5/5_3.f',\n", + " 'test_tree/bib/9/5/5_4.f',\n", + " 'test_tree/bib/9/5/5_7.f'],\n", + " ['test_tree/bib/9/2/2_6.f',\n", + " 'test_tree/bib/9/2/2_1.f',\n", + " 'test_tree/bib/9/2/2_9.f',\n", + " 'test_tree/bib/9/2/2_2.f',\n", + " 'test_tree/bib/9/2/2_10.f',\n", + " 'test_tree/bib/9/2/2_5.f',\n", + " 'test_tree/bib/9/2/2_4.f',\n", + " 'test_tree/bib/9/2/2_3.f',\n", + " 'test_tree/bib/9/2/2_7.f',\n", + " 'test_tree/bib/9/2/2_8.f'],\n", + " ['test_tree/bib/9/10/10_10.f',\n", + " 'test_tree/bib/9/10/10_8.f',\n", + " 'test_tree/bib/9/10/10_3.f',\n", + " 'test_tree/bib/9/10/10_4.f',\n", + " 'test_tree/bib/9/10/10_1.f',\n", + " 'test_tree/bib/9/10/10_9.f',\n", + " 'test_tree/bib/9/10/10_6.f',\n", + " 'test_tree/bib/9/10/10_7.f',\n", + " 'test_tree/bib/9/10/10_5.f',\n", + " 'test_tree/bib/9/10/10_2.f'],\n", + " ['test_tree/bib/9/8/8_2.f',\n", + " 'test_tree/bib/9/8/8_8.f',\n", + " 'test_tree/bib/9/8/8_9.f',\n", + " 'test_tree/bib/9/8/8_7.f',\n", + " 'test_tree/bib/9/8/8_4.f',\n", + " 'test_tree/bib/9/8/8_1.f',\n", + " 'test_tree/bib/9/8/8_3.f',\n", + " 'test_tree/bib/9/8/8_10.f',\n", + " 'test_tree/bib/9/8/8_6.f',\n", + " 'test_tree/bib/9/8/8_5.f'],\n", + " ['test_tree/bib/9/4/4_5.f',\n", + " 'test_tree/bib/9/4/4_7.f',\n", + " 'test_tree/bib/9/4/4_4.f',\n", + " 'test_tree/bib/9/4/4_6.f',\n", + " 'test_tree/bib/9/4/4_8.f',\n", + " 'test_tree/bib/9/4/4_3.f',\n", + " 'test_tree/bib/9/4/4_9.f',\n", + " 'test_tree/bib/9/4/4_2.f',\n", + " 'test_tree/bib/9/4/4_10.f',\n", + " 'test_tree/bib/9/4/4_1.f'],\n", + " ['test_tree/bib/9/9/9_4.f',\n", + " 'test_tree/bib/9/9/9_5.f',\n", + " 'test_tree/bib/9/9/9_8.f',\n", + " 'test_tree/bib/9/9/9_7.f',\n", + " 'test_tree/bib/9/9/9_6.f',\n", + " 'test_tree/bib/9/9/9_1.f',\n", + " 'test_tree/bib/9/9/9_10.f',\n", + " 'test_tree/bib/9/9/9_2.f',\n", + " 'test_tree/bib/9/9/9_3.f',\n", + " 'test_tree/bib/9/9/9_9.f'],\n", + " ['test_tree/bib/9/6/6_6.f',\n", + " 'test_tree/bib/9/6/6_4.f',\n", + " 'test_tree/bib/9/6/6_3.f',\n", + " 'test_tree/bib/9/6/6_5.f',\n", + " 'test_tree/bib/9/6/6_8.f',\n", + " 'test_tree/bib/9/6/6_1.f',\n", + " 'test_tree/bib/9/6/6_10.f',\n", + " 'test_tree/bib/9/6/6_9.f',\n", + " 'test_tree/bib/9/6/6_7.f',\n", + " 'test_tree/bib/9/6/6_2.f'],\n", + " ['test_tree/bib/9/1/1_6.f',\n", + " 'test_tree/bib/9/1/1_9.f',\n", + " 'test_tree/bib/9/1/1_10.f',\n", + " 'test_tree/bib/9/1/1_1.f',\n", + " 'test_tree/bib/9/1/1_3.f',\n", + " 'test_tree/bib/9/1/1_7.f',\n", + " 'test_tree/bib/9/1/1_5.f',\n", + " 'test_tree/bib/9/1/1_2.f',\n", + " 'test_tree/bib/9/1/1_4.f',\n", + " 'test_tree/bib/9/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bib/9/3/3_7.f',\n", + " '/home/dave/test_tree/bib/9/3/3_9.f',\n", + " '/home/dave/test_tree/bib/9/3/3_8.f',\n", + " '/home/dave/test_tree/bib/9/3/3_5.f',\n", + " '/home/dave/test_tree/bib/9/3/3_6.f',\n", + " '/home/dave/test_tree/bib/9/3/3_4.f',\n", + " '/home/dave/test_tree/bib/9/3/3_2.f',\n", + " '/home/dave/test_tree/bib/9/3/3_3.f',\n", + " '/home/dave/test_tree/bib/9/3/3_10.f',\n", + " '/home/dave/test_tree/bib/9/3/3_1.f'],\n", + " ['/home/dave/test_tree/bib/9/7/7_10.f',\n", + " '/home/dave/test_tree/bib/9/7/7_7.f',\n", + " '/home/dave/test_tree/bib/9/7/7_6.f',\n", + " '/home/dave/test_tree/bib/9/7/7_8.f',\n", + " '/home/dave/test_tree/bib/9/7/7_9.f',\n", + " '/home/dave/test_tree/bib/9/7/7_3.f',\n", + " '/home/dave/test_tree/bib/9/7/7_1.f',\n", + " '/home/dave/test_tree/bib/9/7/7_4.f',\n", + " '/home/dave/test_tree/bib/9/7/7_2.f',\n", + " '/home/dave/test_tree/bib/9/7/7_5.f'],\n", + " ['/home/dave/test_tree/bib/9/5/5_9.f',\n", + " '/home/dave/test_tree/bib/9/5/5_10.f',\n", + " '/home/dave/test_tree/bib/9/5/5_8.f',\n", + " '/home/dave/test_tree/bib/9/5/5_1.f',\n", + " '/home/dave/test_tree/bib/9/5/5_5.f',\n", + " '/home/dave/test_tree/bib/9/5/5_2.f',\n", + " '/home/dave/test_tree/bib/9/5/5_6.f',\n", + " '/home/dave/test_tree/bib/9/5/5_3.f',\n", + " '/home/dave/test_tree/bib/9/5/5_4.f',\n", + " '/home/dave/test_tree/bib/9/5/5_7.f'],\n", + " ['/home/dave/test_tree/bib/9/2/2_6.f',\n", + " '/home/dave/test_tree/bib/9/2/2_1.f',\n", + " '/home/dave/test_tree/bib/9/2/2_9.f',\n", + " '/home/dave/test_tree/bib/9/2/2_2.f',\n", + " '/home/dave/test_tree/bib/9/2/2_10.f',\n", + " '/home/dave/test_tree/bib/9/2/2_5.f',\n", + " '/home/dave/test_tree/bib/9/2/2_4.f',\n", + " '/home/dave/test_tree/bib/9/2/2_3.f',\n", + " '/home/dave/test_tree/bib/9/2/2_7.f',\n", + " '/home/dave/test_tree/bib/9/2/2_8.f'],\n", + " ['/home/dave/test_tree/bib/9/10/10_10.f',\n", + " '/home/dave/test_tree/bib/9/10/10_8.f',\n", + " '/home/dave/test_tree/bib/9/10/10_3.f',\n", + " '/home/dave/test_tree/bib/9/10/10_4.f',\n", + " '/home/dave/test_tree/bib/9/10/10_1.f',\n", + " '/home/dave/test_tree/bib/9/10/10_9.f',\n", + " '/home/dave/test_tree/bib/9/10/10_6.f',\n", + " '/home/dave/test_tree/bib/9/10/10_7.f',\n", + " '/home/dave/test_tree/bib/9/10/10_5.f',\n", + " '/home/dave/test_tree/bib/9/10/10_2.f'],\n", + " ['/home/dave/test_tree/bib/9/8/8_2.f',\n", + " '/home/dave/test_tree/bib/9/8/8_8.f',\n", + " '/home/dave/test_tree/bib/9/8/8_9.f',\n", + " '/home/dave/test_tree/bib/9/8/8_7.f',\n", + " '/home/dave/test_tree/bib/9/8/8_4.f',\n", + " '/home/dave/test_tree/bib/9/8/8_1.f',\n", + " '/home/dave/test_tree/bib/9/8/8_3.f',\n", + " '/home/dave/test_tree/bib/9/8/8_10.f',\n", + " '/home/dave/test_tree/bib/9/8/8_6.f',\n", + " '/home/dave/test_tree/bib/9/8/8_5.f'],\n", + " ['/home/dave/test_tree/bib/9/4/4_5.f',\n", + " '/home/dave/test_tree/bib/9/4/4_7.f',\n", + " '/home/dave/test_tree/bib/9/4/4_4.f',\n", + " '/home/dave/test_tree/bib/9/4/4_6.f',\n", + " '/home/dave/test_tree/bib/9/4/4_8.f',\n", + " '/home/dave/test_tree/bib/9/4/4_3.f',\n", + " '/home/dave/test_tree/bib/9/4/4_9.f',\n", + " '/home/dave/test_tree/bib/9/4/4_2.f',\n", + " '/home/dave/test_tree/bib/9/4/4_10.f',\n", + " '/home/dave/test_tree/bib/9/4/4_1.f'],\n", + " ['/home/dave/test_tree/bib/9/9/9_4.f',\n", + " '/home/dave/test_tree/bib/9/9/9_5.f',\n", + " '/home/dave/test_tree/bib/9/9/9_8.f',\n", + " '/home/dave/test_tree/bib/9/9/9_7.f',\n", + " '/home/dave/test_tree/bib/9/9/9_6.f',\n", + " '/home/dave/test_tree/bib/9/9/9_1.f',\n", + " '/home/dave/test_tree/bib/9/9/9_10.f',\n", + " '/home/dave/test_tree/bib/9/9/9_2.f',\n", + " '/home/dave/test_tree/bib/9/9/9_3.f',\n", + " '/home/dave/test_tree/bib/9/9/9_9.f'],\n", + " ['/home/dave/test_tree/bib/9/6/6_6.f',\n", + " '/home/dave/test_tree/bib/9/6/6_4.f',\n", + " '/home/dave/test_tree/bib/9/6/6_3.f',\n", + " '/home/dave/test_tree/bib/9/6/6_5.f',\n", + " '/home/dave/test_tree/bib/9/6/6_8.f',\n", + " '/home/dave/test_tree/bib/9/6/6_1.f',\n", + " '/home/dave/test_tree/bib/9/6/6_10.f',\n", + " '/home/dave/test_tree/bib/9/6/6_9.f',\n", + " '/home/dave/test_tree/bib/9/6/6_7.f',\n", + " '/home/dave/test_tree/bib/9/6/6_2.f'],\n", + " ['/home/dave/test_tree/bib/9/1/1_6.f',\n", + " '/home/dave/test_tree/bib/9/1/1_9.f',\n", + " '/home/dave/test_tree/bib/9/1/1_10.f',\n", + " '/home/dave/test_tree/bib/9/1/1_1.f',\n", + " '/home/dave/test_tree/bib/9/1/1_3.f',\n", + " '/home/dave/test_tree/bib/9/1/1_7.f',\n", + " '/home/dave/test_tree/bib/9/1/1_5.f',\n", + " '/home/dave/test_tree/bib/9/1/1_2.f',\n", + " '/home/dave/test_tree/bib/9/1/1_4.f',\n", + " '/home/dave/test_tree/bib/9/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bib',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bib/6': {'parent_folder': '/home/dave/test_tree/bib/6',\n", + " 'folders': ['/home/dave/test_tree/bib/6/3',\n", + " '/home/dave/test_tree/bib/6/7',\n", + " '/home/dave/test_tree/bib/6/5',\n", + " '/home/dave/test_tree/bib/6/2',\n", + " '/home/dave/test_tree/bib/6/10',\n", + " '/home/dave/test_tree/bib/6/8',\n", + " '/home/dave/test_tree/bib/6/4',\n", + " '/home/dave/test_tree/bib/6/9',\n", + " '/home/dave/test_tree/bib/6/6',\n", + " '/home/dave/test_tree/bib/6/1'],\n", + " 'object_names': [['test_tree/bib/6/3/3_7.f',\n", + " 'test_tree/bib/6/3/3_9.f',\n", + " 'test_tree/bib/6/3/3_8.f',\n", + " 'test_tree/bib/6/3/3_5.f',\n", + " 'test_tree/bib/6/3/3_6.f',\n", + " 'test_tree/bib/6/3/3_4.f',\n", + " 'test_tree/bib/6/3/3_2.f',\n", + " 'test_tree/bib/6/3/3_3.f',\n", + " 'test_tree/bib/6/3/3_10.f',\n", + " 'test_tree/bib/6/3/3_1.f'],\n", + " ['test_tree/bib/6/7/7_10.f',\n", + " 'test_tree/bib/6/7/7_7.f',\n", + " 'test_tree/bib/6/7/7_6.f',\n", + " 'test_tree/bib/6/7/7_8.f',\n", + " 'test_tree/bib/6/7/7_9.f',\n", + " 'test_tree/bib/6/7/7_3.f',\n", + " 'test_tree/bib/6/7/7_1.f',\n", + " 'test_tree/bib/6/7/7_4.f',\n", + " 'test_tree/bib/6/7/7_2.f',\n", + " 'test_tree/bib/6/7/7_5.f'],\n", + " ['test_tree/bib/6/5/5_9.f',\n", + " 'test_tree/bib/6/5/5_10.f',\n", + " 'test_tree/bib/6/5/5_8.f',\n", + " 'test_tree/bib/6/5/5_1.f',\n", + " 'test_tree/bib/6/5/5_5.f',\n", + " 'test_tree/bib/6/5/5_2.f',\n", + " 'test_tree/bib/6/5/5_6.f',\n", + " 'test_tree/bib/6/5/5_3.f',\n", + " 'test_tree/bib/6/5/5_4.f',\n", + " 'test_tree/bib/6/5/5_7.f'],\n", + " ['test_tree/bib/6/2/2_6.f',\n", + " 'test_tree/bib/6/2/2_1.f',\n", + " 'test_tree/bib/6/2/2_9.f',\n", + " 'test_tree/bib/6/2/2_2.f',\n", + " 'test_tree/bib/6/2/2_10.f',\n", + " 'test_tree/bib/6/2/2_5.f',\n", + " 'test_tree/bib/6/2/2_4.f',\n", + " 'test_tree/bib/6/2/2_3.f',\n", + " 'test_tree/bib/6/2/2_7.f',\n", + " 'test_tree/bib/6/2/2_8.f'],\n", + " ['test_tree/bib/6/10/10_10.f',\n", + " 'test_tree/bib/6/10/10_8.f',\n", + " 'test_tree/bib/6/10/10_3.f',\n", + " 'test_tree/bib/6/10/10_4.f',\n", + " 'test_tree/bib/6/10/10_1.f',\n", + " 'test_tree/bib/6/10/10_9.f',\n", + " 'test_tree/bib/6/10/10_6.f',\n", + " 'test_tree/bib/6/10/10_7.f',\n", + " 'test_tree/bib/6/10/10_5.f',\n", + " 'test_tree/bib/6/10/10_2.f'],\n", + " ['test_tree/bib/6/8/8_2.f',\n", + " 'test_tree/bib/6/8/8_8.f',\n", + " 'test_tree/bib/6/8/8_9.f',\n", + " 'test_tree/bib/6/8/8_7.f',\n", + " 'test_tree/bib/6/8/8_4.f',\n", + " 'test_tree/bib/6/8/8_1.f',\n", + " 'test_tree/bib/6/8/8_3.f',\n", + " 'test_tree/bib/6/8/8_10.f',\n", + " 'test_tree/bib/6/8/8_6.f',\n", + " 'test_tree/bib/6/8/8_5.f'],\n", + " ['test_tree/bib/6/4/4_5.f',\n", + " 'test_tree/bib/6/4/4_7.f',\n", + " 'test_tree/bib/6/4/4_4.f',\n", + " 'test_tree/bib/6/4/4_6.f',\n", + " 'test_tree/bib/6/4/4_8.f',\n", + " 'test_tree/bib/6/4/4_3.f',\n", + " 'test_tree/bib/6/4/4_9.f',\n", + " 'test_tree/bib/6/4/4_2.f',\n", + " 'test_tree/bib/6/4/4_10.f',\n", + " 'test_tree/bib/6/4/4_1.f'],\n", + " ['test_tree/bib/6/9/9_4.f',\n", + " 'test_tree/bib/6/9/9_5.f',\n", + " 'test_tree/bib/6/9/9_8.f',\n", + " 'test_tree/bib/6/9/9_7.f',\n", + " 'test_tree/bib/6/9/9_6.f',\n", + " 'test_tree/bib/6/9/9_1.f',\n", + " 'test_tree/bib/6/9/9_10.f',\n", + " 'test_tree/bib/6/9/9_2.f',\n", + " 'test_tree/bib/6/9/9_3.f',\n", + " 'test_tree/bib/6/9/9_9.f'],\n", + " ['test_tree/bib/6/6/6_6.f',\n", + " 'test_tree/bib/6/6/6_4.f',\n", + " 'test_tree/bib/6/6/6_3.f',\n", + " 'test_tree/bib/6/6/6_5.f',\n", + " 'test_tree/bib/6/6/6_8.f',\n", + " 'test_tree/bib/6/6/6_1.f',\n", + " 'test_tree/bib/6/6/6_10.f',\n", + " 'test_tree/bib/6/6/6_9.f',\n", + " 'test_tree/bib/6/6/6_7.f',\n", + " 'test_tree/bib/6/6/6_2.f'],\n", + " ['test_tree/bib/6/1/1_6.f',\n", + " 'test_tree/bib/6/1/1_9.f',\n", + " 'test_tree/bib/6/1/1_10.f',\n", + " 'test_tree/bib/6/1/1_1.f',\n", + " 'test_tree/bib/6/1/1_3.f',\n", + " 'test_tree/bib/6/1/1_7.f',\n", + " 'test_tree/bib/6/1/1_5.f',\n", + " 'test_tree/bib/6/1/1_2.f',\n", + " 'test_tree/bib/6/1/1_4.f',\n", + " 'test_tree/bib/6/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bib/6/3/3_7.f',\n", + " '/home/dave/test_tree/bib/6/3/3_9.f',\n", + " '/home/dave/test_tree/bib/6/3/3_8.f',\n", + " '/home/dave/test_tree/bib/6/3/3_5.f',\n", + " '/home/dave/test_tree/bib/6/3/3_6.f',\n", + " '/home/dave/test_tree/bib/6/3/3_4.f',\n", + " '/home/dave/test_tree/bib/6/3/3_2.f',\n", + " '/home/dave/test_tree/bib/6/3/3_3.f',\n", + " '/home/dave/test_tree/bib/6/3/3_10.f',\n", + " '/home/dave/test_tree/bib/6/3/3_1.f'],\n", + " ['/home/dave/test_tree/bib/6/7/7_10.f',\n", + " '/home/dave/test_tree/bib/6/7/7_7.f',\n", + " '/home/dave/test_tree/bib/6/7/7_6.f',\n", + " '/home/dave/test_tree/bib/6/7/7_8.f',\n", + " '/home/dave/test_tree/bib/6/7/7_9.f',\n", + " '/home/dave/test_tree/bib/6/7/7_3.f',\n", + " '/home/dave/test_tree/bib/6/7/7_1.f',\n", + " '/home/dave/test_tree/bib/6/7/7_4.f',\n", + " '/home/dave/test_tree/bib/6/7/7_2.f',\n", + " '/home/dave/test_tree/bib/6/7/7_5.f'],\n", + " ['/home/dave/test_tree/bib/6/5/5_9.f',\n", + " '/home/dave/test_tree/bib/6/5/5_10.f',\n", + " '/home/dave/test_tree/bib/6/5/5_8.f',\n", + " '/home/dave/test_tree/bib/6/5/5_1.f',\n", + " '/home/dave/test_tree/bib/6/5/5_5.f',\n", + " '/home/dave/test_tree/bib/6/5/5_2.f',\n", + " '/home/dave/test_tree/bib/6/5/5_6.f',\n", + " '/home/dave/test_tree/bib/6/5/5_3.f',\n", + " '/home/dave/test_tree/bib/6/5/5_4.f',\n", + " '/home/dave/test_tree/bib/6/5/5_7.f'],\n", + " ['/home/dave/test_tree/bib/6/2/2_6.f',\n", + " '/home/dave/test_tree/bib/6/2/2_1.f',\n", + " '/home/dave/test_tree/bib/6/2/2_9.f',\n", + " '/home/dave/test_tree/bib/6/2/2_2.f',\n", + " '/home/dave/test_tree/bib/6/2/2_10.f',\n", + " '/home/dave/test_tree/bib/6/2/2_5.f',\n", + " '/home/dave/test_tree/bib/6/2/2_4.f',\n", + " '/home/dave/test_tree/bib/6/2/2_3.f',\n", + " '/home/dave/test_tree/bib/6/2/2_7.f',\n", + " '/home/dave/test_tree/bib/6/2/2_8.f'],\n", + " ['/home/dave/test_tree/bib/6/10/10_10.f',\n", + " '/home/dave/test_tree/bib/6/10/10_8.f',\n", + " '/home/dave/test_tree/bib/6/10/10_3.f',\n", + " '/home/dave/test_tree/bib/6/10/10_4.f',\n", + " '/home/dave/test_tree/bib/6/10/10_1.f',\n", + " '/home/dave/test_tree/bib/6/10/10_9.f',\n", + " '/home/dave/test_tree/bib/6/10/10_6.f',\n", + " '/home/dave/test_tree/bib/6/10/10_7.f',\n", + " '/home/dave/test_tree/bib/6/10/10_5.f',\n", + " '/home/dave/test_tree/bib/6/10/10_2.f'],\n", + " ['/home/dave/test_tree/bib/6/8/8_2.f',\n", + " '/home/dave/test_tree/bib/6/8/8_8.f',\n", + " '/home/dave/test_tree/bib/6/8/8_9.f',\n", + " '/home/dave/test_tree/bib/6/8/8_7.f',\n", + " '/home/dave/test_tree/bib/6/8/8_4.f',\n", + " '/home/dave/test_tree/bib/6/8/8_1.f',\n", + " '/home/dave/test_tree/bib/6/8/8_3.f',\n", + " '/home/dave/test_tree/bib/6/8/8_10.f',\n", + " '/home/dave/test_tree/bib/6/8/8_6.f',\n", + " '/home/dave/test_tree/bib/6/8/8_5.f'],\n", + " ['/home/dave/test_tree/bib/6/4/4_5.f',\n", + " '/home/dave/test_tree/bib/6/4/4_7.f',\n", + " '/home/dave/test_tree/bib/6/4/4_4.f',\n", + " '/home/dave/test_tree/bib/6/4/4_6.f',\n", + " '/home/dave/test_tree/bib/6/4/4_8.f',\n", + " '/home/dave/test_tree/bib/6/4/4_3.f',\n", + " '/home/dave/test_tree/bib/6/4/4_9.f',\n", + " '/home/dave/test_tree/bib/6/4/4_2.f',\n", + " '/home/dave/test_tree/bib/6/4/4_10.f',\n", + " '/home/dave/test_tree/bib/6/4/4_1.f'],\n", + " ['/home/dave/test_tree/bib/6/9/9_4.f',\n", + " '/home/dave/test_tree/bib/6/9/9_5.f',\n", + " '/home/dave/test_tree/bib/6/9/9_8.f',\n", + " '/home/dave/test_tree/bib/6/9/9_7.f',\n", + " '/home/dave/test_tree/bib/6/9/9_6.f',\n", + " '/home/dave/test_tree/bib/6/9/9_1.f',\n", + " '/home/dave/test_tree/bib/6/9/9_10.f',\n", + " '/home/dave/test_tree/bib/6/9/9_2.f',\n", + " '/home/dave/test_tree/bib/6/9/9_3.f',\n", + " '/home/dave/test_tree/bib/6/9/9_9.f'],\n", + " ['/home/dave/test_tree/bib/6/6/6_6.f',\n", + " '/home/dave/test_tree/bib/6/6/6_4.f',\n", + " '/home/dave/test_tree/bib/6/6/6_3.f',\n", + " '/home/dave/test_tree/bib/6/6/6_5.f',\n", + " '/home/dave/test_tree/bib/6/6/6_8.f',\n", + " '/home/dave/test_tree/bib/6/6/6_1.f',\n", + " '/home/dave/test_tree/bib/6/6/6_10.f',\n", + " '/home/dave/test_tree/bib/6/6/6_9.f',\n", + " '/home/dave/test_tree/bib/6/6/6_7.f',\n", + " '/home/dave/test_tree/bib/6/6/6_2.f'],\n", + " ['/home/dave/test_tree/bib/6/1/1_6.f',\n", + " '/home/dave/test_tree/bib/6/1/1_9.f',\n", + " '/home/dave/test_tree/bib/6/1/1_10.f',\n", + " '/home/dave/test_tree/bib/6/1/1_1.f',\n", + " '/home/dave/test_tree/bib/6/1/1_3.f',\n", + " '/home/dave/test_tree/bib/6/1/1_7.f',\n", + " '/home/dave/test_tree/bib/6/1/1_5.f',\n", + " '/home/dave/test_tree/bib/6/1/1_2.f',\n", + " '/home/dave/test_tree/bib/6/1/1_4.f',\n", + " '/home/dave/test_tree/bib/6/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bib',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bob/3': {'parent_folder': '/home/dave/test_tree/bob/3',\n", + " 'folders': ['/home/dave/test_tree/bob/3/3',\n", + " '/home/dave/test_tree/bob/3/7',\n", + " '/home/dave/test_tree/bob/3/5',\n", + " '/home/dave/test_tree/bob/3/2',\n", + " '/home/dave/test_tree/bob/3/10',\n", + " '/home/dave/test_tree/bob/3/8',\n", + " '/home/dave/test_tree/bob/3/4',\n", + " '/home/dave/test_tree/bob/3/9',\n", + " '/home/dave/test_tree/bob/3/6',\n", + " '/home/dave/test_tree/bob/3/1'],\n", + " 'object_names': [['test_tree/bob/3/3/3_7.f',\n", + " 'test_tree/bob/3/3/3_9.f',\n", + " 'test_tree/bob/3/3/3_8.f',\n", + " 'test_tree/bob/3/3/3_5.f',\n", + " 'test_tree/bob/3/3/3_6.f',\n", + " 'test_tree/bob/3/3/3_4.f',\n", + " 'test_tree/bob/3/3/3_2.f',\n", + " 'test_tree/bob/3/3/3_3.f',\n", + " 'test_tree/bob/3/3/3_10.f',\n", + " 'test_tree/bob/3/3/3_1.f'],\n", + " ['test_tree/bob/3/7/7_10.f',\n", + " 'test_tree/bob/3/7/7_7.f',\n", + " 'test_tree/bob/3/7/7_6.f',\n", + " 'test_tree/bob/3/7/7_8.f',\n", + " 'test_tree/bob/3/7/7_9.f',\n", + " 'test_tree/bob/3/7/7_3.f',\n", + " 'test_tree/bob/3/7/7_1.f',\n", + " 'test_tree/bob/3/7/7_4.f',\n", + " 'test_tree/bob/3/7/7_2.f',\n", + " 'test_tree/bob/3/7/7_5.f'],\n", + " ['test_tree/bob/3/5/5_9.f',\n", + " 'test_tree/bob/3/5/5_10.f',\n", + " 'test_tree/bob/3/5/5_8.f',\n", + " 'test_tree/bob/3/5/5_1.f',\n", + " 'test_tree/bob/3/5/5_5.f',\n", + " 'test_tree/bob/3/5/5_2.f',\n", + " 'test_tree/bob/3/5/5_6.f',\n", + " 'test_tree/bob/3/5/5_3.f',\n", + " 'test_tree/bob/3/5/5_4.f',\n", + " 'test_tree/bob/3/5/5_7.f'],\n", + " ['test_tree/bob/3/2/2_6.f',\n", + " 'test_tree/bob/3/2/2_1.f',\n", + " 'test_tree/bob/3/2/2_9.f',\n", + " 'test_tree/bob/3/2/2_2.f',\n", + " 'test_tree/bob/3/2/2_10.f',\n", + " 'test_tree/bob/3/2/2_5.f',\n", + " 'test_tree/bob/3/2/2_4.f',\n", + " 'test_tree/bob/3/2/2_3.f',\n", + " 'test_tree/bob/3/2/2_7.f',\n", + " 'test_tree/bob/3/2/2_8.f'],\n", + " ['test_tree/bob/3/10/10_10.f',\n", + " 'test_tree/bob/3/10/10_8.f',\n", + " 'test_tree/bob/3/10/10_3.f',\n", + " 'test_tree/bob/3/10/10_4.f',\n", + " 'test_tree/bob/3/10/10_1.f',\n", + " 'test_tree/bob/3/10/10_9.f',\n", + " 'test_tree/bob/3/10/10_6.f',\n", + " 'test_tree/bob/3/10/10_7.f',\n", + " 'test_tree/bob/3/10/10_5.f',\n", + " 'test_tree/bob/3/10/10_2.f'],\n", + " ['test_tree/bob/3/8/8_2.f',\n", + " 'test_tree/bob/3/8/8_8.f',\n", + " 'test_tree/bob/3/8/8_9.f',\n", + " 'test_tree/bob/3/8/8_7.f',\n", + " 'test_tree/bob/3/8/8_4.f',\n", + " 'test_tree/bob/3/8/8_1.f',\n", + " 'test_tree/bob/3/8/8_3.f',\n", + " 'test_tree/bob/3/8/8_10.f',\n", + " 'test_tree/bob/3/8/8_6.f',\n", + " 'test_tree/bob/3/8/8_5.f'],\n", + " ['test_tree/bob/3/4/4_5.f',\n", + " 'test_tree/bob/3/4/4_7.f',\n", + " 'test_tree/bob/3/4/4_4.f',\n", + " 'test_tree/bob/3/4/4_6.f',\n", + " 'test_tree/bob/3/4/4_8.f',\n", + " 'test_tree/bob/3/4/4_3.f',\n", + " 'test_tree/bob/3/4/4_9.f',\n", + " 'test_tree/bob/3/4/4_2.f',\n", + " 'test_tree/bob/3/4/4_10.f',\n", + " 'test_tree/bob/3/4/4_1.f'],\n", + " ['test_tree/bob/3/9/9_4.f',\n", + " 'test_tree/bob/3/9/9_5.f',\n", + " 'test_tree/bob/3/9/9_8.f',\n", + " 'test_tree/bob/3/9/9_7.f',\n", + " 'test_tree/bob/3/9/9_6.f',\n", + " 'test_tree/bob/3/9/9_1.f',\n", + " 'test_tree/bob/3/9/9_10.f',\n", + " 'test_tree/bob/3/9/9_2.f',\n", + " 'test_tree/bob/3/9/9_3.f',\n", + " 'test_tree/bob/3/9/9_9.f'],\n", + " ['test_tree/bob/3/6/6_6.f',\n", + " 'test_tree/bob/3/6/6_4.f',\n", + " 'test_tree/bob/3/6/6_3.f',\n", + " 'test_tree/bob/3/6/6_5.f',\n", + " 'test_tree/bob/3/6/6_8.f',\n", + " 'test_tree/bob/3/6/6_1.f',\n", + " 'test_tree/bob/3/6/6_10.f',\n", + " 'test_tree/bob/3/6/6_9.f',\n", + " 'test_tree/bob/3/6/6_7.f',\n", + " 'test_tree/bob/3/6/6_2.f'],\n", + " ['test_tree/bob/3/1/1_6.f',\n", + " 'test_tree/bob/3/1/1_9.f',\n", + " 'test_tree/bob/3/1/1_10.f',\n", + " 'test_tree/bob/3/1/1_1.f',\n", + " 'test_tree/bob/3/1/1_3.f',\n", + " 'test_tree/bob/3/1/1_7.f',\n", + " 'test_tree/bob/3/1/1_5.f',\n", + " 'test_tree/bob/3/1/1_2.f',\n", + " 'test_tree/bob/3/1/1_4.f',\n", + " 'test_tree/bob/3/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bob/3/3/3_7.f',\n", + " '/home/dave/test_tree/bob/3/3/3_9.f',\n", + " '/home/dave/test_tree/bob/3/3/3_8.f',\n", + " '/home/dave/test_tree/bob/3/3/3_5.f',\n", + " '/home/dave/test_tree/bob/3/3/3_6.f',\n", + " '/home/dave/test_tree/bob/3/3/3_4.f',\n", + " '/home/dave/test_tree/bob/3/3/3_2.f',\n", + " '/home/dave/test_tree/bob/3/3/3_3.f',\n", + " '/home/dave/test_tree/bob/3/3/3_10.f',\n", + " '/home/dave/test_tree/bob/3/3/3_1.f'],\n", + " ['/home/dave/test_tree/bob/3/7/7_10.f',\n", + " '/home/dave/test_tree/bob/3/7/7_7.f',\n", + " '/home/dave/test_tree/bob/3/7/7_6.f',\n", + " '/home/dave/test_tree/bob/3/7/7_8.f',\n", + " '/home/dave/test_tree/bob/3/7/7_9.f',\n", + " '/home/dave/test_tree/bob/3/7/7_3.f',\n", + " '/home/dave/test_tree/bob/3/7/7_1.f',\n", + " '/home/dave/test_tree/bob/3/7/7_4.f',\n", + " '/home/dave/test_tree/bob/3/7/7_2.f',\n", + " '/home/dave/test_tree/bob/3/7/7_5.f'],\n", + " ['/home/dave/test_tree/bob/3/5/5_9.f',\n", + " '/home/dave/test_tree/bob/3/5/5_10.f',\n", + " '/home/dave/test_tree/bob/3/5/5_8.f',\n", + " '/home/dave/test_tree/bob/3/5/5_1.f',\n", + " '/home/dave/test_tree/bob/3/5/5_5.f',\n", + " '/home/dave/test_tree/bob/3/5/5_2.f',\n", + " '/home/dave/test_tree/bob/3/5/5_6.f',\n", + " '/home/dave/test_tree/bob/3/5/5_3.f',\n", + " '/home/dave/test_tree/bob/3/5/5_4.f',\n", + " '/home/dave/test_tree/bob/3/5/5_7.f'],\n", + " ['/home/dave/test_tree/bob/3/2/2_6.f',\n", + " '/home/dave/test_tree/bob/3/2/2_1.f',\n", + " '/home/dave/test_tree/bob/3/2/2_9.f',\n", + " '/home/dave/test_tree/bob/3/2/2_2.f',\n", + " '/home/dave/test_tree/bob/3/2/2_10.f',\n", + " '/home/dave/test_tree/bob/3/2/2_5.f',\n", + " '/home/dave/test_tree/bob/3/2/2_4.f',\n", + " '/home/dave/test_tree/bob/3/2/2_3.f',\n", + " '/home/dave/test_tree/bob/3/2/2_7.f',\n", + " '/home/dave/test_tree/bob/3/2/2_8.f'],\n", + " ['/home/dave/test_tree/bob/3/10/10_10.f',\n", + " '/home/dave/test_tree/bob/3/10/10_8.f',\n", + " '/home/dave/test_tree/bob/3/10/10_3.f',\n", + " '/home/dave/test_tree/bob/3/10/10_4.f',\n", + " '/home/dave/test_tree/bob/3/10/10_1.f',\n", + " '/home/dave/test_tree/bob/3/10/10_9.f',\n", + " '/home/dave/test_tree/bob/3/10/10_6.f',\n", + " '/home/dave/test_tree/bob/3/10/10_7.f',\n", + " '/home/dave/test_tree/bob/3/10/10_5.f',\n", + " '/home/dave/test_tree/bob/3/10/10_2.f'],\n", + " ['/home/dave/test_tree/bob/3/8/8_2.f',\n", + " '/home/dave/test_tree/bob/3/8/8_8.f',\n", + " '/home/dave/test_tree/bob/3/8/8_9.f',\n", + " '/home/dave/test_tree/bob/3/8/8_7.f',\n", + " '/home/dave/test_tree/bob/3/8/8_4.f',\n", + " '/home/dave/test_tree/bob/3/8/8_1.f',\n", + " '/home/dave/test_tree/bob/3/8/8_3.f',\n", + " '/home/dave/test_tree/bob/3/8/8_10.f',\n", + " '/home/dave/test_tree/bob/3/8/8_6.f',\n", + " '/home/dave/test_tree/bob/3/8/8_5.f'],\n", + " ['/home/dave/test_tree/bob/3/4/4_5.f',\n", + " '/home/dave/test_tree/bob/3/4/4_7.f',\n", + " '/home/dave/test_tree/bob/3/4/4_4.f',\n", + " '/home/dave/test_tree/bob/3/4/4_6.f',\n", + " '/home/dave/test_tree/bob/3/4/4_8.f',\n", + " '/home/dave/test_tree/bob/3/4/4_3.f',\n", + " '/home/dave/test_tree/bob/3/4/4_9.f',\n", + " '/home/dave/test_tree/bob/3/4/4_2.f',\n", + " '/home/dave/test_tree/bob/3/4/4_10.f',\n", + " '/home/dave/test_tree/bob/3/4/4_1.f'],\n", + " ['/home/dave/test_tree/bob/3/9/9_4.f',\n", + " '/home/dave/test_tree/bob/3/9/9_5.f',\n", + " '/home/dave/test_tree/bob/3/9/9_8.f',\n", + " '/home/dave/test_tree/bob/3/9/9_7.f',\n", + " '/home/dave/test_tree/bob/3/9/9_6.f',\n", + " '/home/dave/test_tree/bob/3/9/9_1.f',\n", + " '/home/dave/test_tree/bob/3/9/9_10.f',\n", + " '/home/dave/test_tree/bob/3/9/9_2.f',\n", + " '/home/dave/test_tree/bob/3/9/9_3.f',\n", + " '/home/dave/test_tree/bob/3/9/9_9.f'],\n", + " ['/home/dave/test_tree/bob/3/6/6_6.f',\n", + " '/home/dave/test_tree/bob/3/6/6_4.f',\n", + " '/home/dave/test_tree/bob/3/6/6_3.f',\n", + " '/home/dave/test_tree/bob/3/6/6_5.f',\n", + " '/home/dave/test_tree/bob/3/6/6_8.f',\n", + " '/home/dave/test_tree/bob/3/6/6_1.f',\n", + " '/home/dave/test_tree/bob/3/6/6_10.f',\n", + " '/home/dave/test_tree/bob/3/6/6_9.f',\n", + " '/home/dave/test_tree/bob/3/6/6_7.f',\n", + " '/home/dave/test_tree/bob/3/6/6_2.f'],\n", + " ['/home/dave/test_tree/bob/3/1/1_6.f',\n", + " '/home/dave/test_tree/bob/3/1/1_9.f',\n", + " '/home/dave/test_tree/bob/3/1/1_10.f',\n", + " '/home/dave/test_tree/bob/3/1/1_1.f',\n", + " '/home/dave/test_tree/bob/3/1/1_3.f',\n", + " '/home/dave/test_tree/bob/3/1/1_7.f',\n", + " '/home/dave/test_tree/bob/3/1/1_5.f',\n", + " '/home/dave/test_tree/bob/3/1/1_2.f',\n", + " '/home/dave/test_tree/bob/3/1/1_4.f',\n", + " '/home/dave/test_tree/bob/3/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bob',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bob/5': {'parent_folder': '/home/dave/test_tree/bob/5',\n", + " 'folders': ['/home/dave/test_tree/bob/5/3',\n", + " '/home/dave/test_tree/bob/5/7',\n", + " '/home/dave/test_tree/bob/5/5',\n", + " '/home/dave/test_tree/bob/5/2',\n", + " '/home/dave/test_tree/bob/5/10',\n", + " '/home/dave/test_tree/bob/5/8',\n", + " '/home/dave/test_tree/bob/5/4',\n", + " '/home/dave/test_tree/bob/5/9',\n", + " '/home/dave/test_tree/bob/5/6',\n", + " '/home/dave/test_tree/bob/5/1'],\n", + " 'object_names': [['test_tree/bob/5/3/3_7.f',\n", + " 'test_tree/bob/5/3/3_9.f',\n", + " 'test_tree/bob/5/3/3_8.f',\n", + " 'test_tree/bob/5/3/3_5.f',\n", + " 'test_tree/bob/5/3/3_6.f',\n", + " 'test_tree/bob/5/3/3_4.f',\n", + " 'test_tree/bob/5/3/3_2.f',\n", + " 'test_tree/bob/5/3/3_3.f',\n", + " 'test_tree/bob/5/3/3_10.f',\n", + " 'test_tree/bob/5/3/3_1.f'],\n", + " ['test_tree/bob/5/7/7_10.f',\n", + " 'test_tree/bob/5/7/7_7.f',\n", + " 'test_tree/bob/5/7/7_6.f',\n", + " 'test_tree/bob/5/7/7_8.f',\n", + " 'test_tree/bob/5/7/7_9.f',\n", + " 'test_tree/bob/5/7/7_3.f',\n", + " 'test_tree/bob/5/7/7_1.f',\n", + " 'test_tree/bob/5/7/7_4.f',\n", + " 'test_tree/bob/5/7/7_2.f',\n", + " 'test_tree/bob/5/7/7_5.f'],\n", + " ['test_tree/bob/5/5/5_9.f',\n", + " 'test_tree/bob/5/5/5_10.f',\n", + " 'test_tree/bob/5/5/5_8.f',\n", + " 'test_tree/bob/5/5/5_1.f',\n", + " 'test_tree/bob/5/5/5_5.f',\n", + " 'test_tree/bob/5/5/5_2.f',\n", + " 'test_tree/bob/5/5/5_6.f',\n", + " 'test_tree/bob/5/5/5_3.f',\n", + " 'test_tree/bob/5/5/5_4.f',\n", + " 'test_tree/bob/5/5/5_7.f'],\n", + " ['test_tree/bob/5/2/2_6.f',\n", + " 'test_tree/bob/5/2/2_1.f',\n", + " 'test_tree/bob/5/2/2_9.f',\n", + " 'test_tree/bob/5/2/2_2.f',\n", + " 'test_tree/bob/5/2/2_10.f',\n", + " 'test_tree/bob/5/2/2_5.f',\n", + " 'test_tree/bob/5/2/2_4.f',\n", + " 'test_tree/bob/5/2/2_3.f',\n", + " 'test_tree/bob/5/2/2_7.f',\n", + " 'test_tree/bob/5/2/2_8.f'],\n", + " ['test_tree/bob/5/10/10_10.f',\n", + " 'test_tree/bob/5/10/10_8.f',\n", + " 'test_tree/bob/5/10/10_3.f',\n", + " 'test_tree/bob/5/10/10_4.f',\n", + " 'test_tree/bob/5/10/10_1.f',\n", + " 'test_tree/bob/5/10/10_9.f',\n", + " 'test_tree/bob/5/10/10_6.f',\n", + " 'test_tree/bob/5/10/10_7.f',\n", + " 'test_tree/bob/5/10/10_5.f',\n", + " 'test_tree/bob/5/10/10_2.f'],\n", + " ['test_tree/bob/5/8/8_2.f',\n", + " 'test_tree/bob/5/8/8_8.f',\n", + " 'test_tree/bob/5/8/8_9.f',\n", + " 'test_tree/bob/5/8/8_7.f',\n", + " 'test_tree/bob/5/8/8_4.f',\n", + " 'test_tree/bob/5/8/8_1.f',\n", + " 'test_tree/bob/5/8/8_3.f',\n", + " 'test_tree/bob/5/8/8_10.f',\n", + " 'test_tree/bob/5/8/8_6.f',\n", + " 'test_tree/bob/5/8/8_5.f'],\n", + " ['test_tree/bob/5/4/4_5.f',\n", + " 'test_tree/bob/5/4/4_7.f',\n", + " 'test_tree/bob/5/4/4_4.f',\n", + " 'test_tree/bob/5/4/4_6.f',\n", + " 'test_tree/bob/5/4/4_8.f',\n", + " 'test_tree/bob/5/4/4_3.f',\n", + " 'test_tree/bob/5/4/4_9.f',\n", + " 'test_tree/bob/5/4/4_2.f',\n", + " 'test_tree/bob/5/4/4_10.f',\n", + " 'test_tree/bob/5/4/4_1.f'],\n", + " ['test_tree/bob/5/9/9_4.f',\n", + " 'test_tree/bob/5/9/9_5.f',\n", + " 'test_tree/bob/5/9/9_8.f',\n", + " 'test_tree/bob/5/9/9_7.f',\n", + " 'test_tree/bob/5/9/9_6.f',\n", + " 'test_tree/bob/5/9/9_1.f',\n", + " 'test_tree/bob/5/9/9_10.f',\n", + " 'test_tree/bob/5/9/9_2.f',\n", + " 'test_tree/bob/5/9/9_3.f',\n", + " 'test_tree/bob/5/9/9_9.f'],\n", + " ['test_tree/bob/5/6/6_6.f',\n", + " 'test_tree/bob/5/6/6_4.f',\n", + " 'test_tree/bob/5/6/6_3.f',\n", + " 'test_tree/bob/5/6/6_5.f',\n", + " 'test_tree/bob/5/6/6_8.f',\n", + " 'test_tree/bob/5/6/6_1.f',\n", + " 'test_tree/bob/5/6/6_10.f',\n", + " 'test_tree/bob/5/6/6_9.f',\n", + " 'test_tree/bob/5/6/6_7.f',\n", + " 'test_tree/bob/5/6/6_2.f'],\n", + " ['test_tree/bob/5/1/1_6.f',\n", + " 'test_tree/bob/5/1/1_9.f',\n", + " 'test_tree/bob/5/1/1_10.f',\n", + " 'test_tree/bob/5/1/1_1.f',\n", + " 'test_tree/bob/5/1/1_3.f',\n", + " 'test_tree/bob/5/1/1_7.f',\n", + " 'test_tree/bob/5/1/1_5.f',\n", + " 'test_tree/bob/5/1/1_2.f',\n", + " 'test_tree/bob/5/1/1_4.f',\n", + " 'test_tree/bob/5/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bob/5/3/3_7.f',\n", + " '/home/dave/test_tree/bob/5/3/3_9.f',\n", + " '/home/dave/test_tree/bob/5/3/3_8.f',\n", + " '/home/dave/test_tree/bob/5/3/3_5.f',\n", + " '/home/dave/test_tree/bob/5/3/3_6.f',\n", + " '/home/dave/test_tree/bob/5/3/3_4.f',\n", + " '/home/dave/test_tree/bob/5/3/3_2.f',\n", + " '/home/dave/test_tree/bob/5/3/3_3.f',\n", + " '/home/dave/test_tree/bob/5/3/3_10.f',\n", + " '/home/dave/test_tree/bob/5/3/3_1.f'],\n", + " ['/home/dave/test_tree/bob/5/7/7_10.f',\n", + " '/home/dave/test_tree/bob/5/7/7_7.f',\n", + " '/home/dave/test_tree/bob/5/7/7_6.f',\n", + " '/home/dave/test_tree/bob/5/7/7_8.f',\n", + " '/home/dave/test_tree/bob/5/7/7_9.f',\n", + " '/home/dave/test_tree/bob/5/7/7_3.f',\n", + " '/home/dave/test_tree/bob/5/7/7_1.f',\n", + " '/home/dave/test_tree/bob/5/7/7_4.f',\n", + " '/home/dave/test_tree/bob/5/7/7_2.f',\n", + " '/home/dave/test_tree/bob/5/7/7_5.f'],\n", + " ['/home/dave/test_tree/bob/5/5/5_9.f',\n", + " '/home/dave/test_tree/bob/5/5/5_10.f',\n", + " '/home/dave/test_tree/bob/5/5/5_8.f',\n", + " '/home/dave/test_tree/bob/5/5/5_1.f',\n", + " '/home/dave/test_tree/bob/5/5/5_5.f',\n", + " '/home/dave/test_tree/bob/5/5/5_2.f',\n", + " '/home/dave/test_tree/bob/5/5/5_6.f',\n", + " '/home/dave/test_tree/bob/5/5/5_3.f',\n", + " '/home/dave/test_tree/bob/5/5/5_4.f',\n", + " '/home/dave/test_tree/bob/5/5/5_7.f'],\n", + " ['/home/dave/test_tree/bob/5/2/2_6.f',\n", + " '/home/dave/test_tree/bob/5/2/2_1.f',\n", + " '/home/dave/test_tree/bob/5/2/2_9.f',\n", + " '/home/dave/test_tree/bob/5/2/2_2.f',\n", + " '/home/dave/test_tree/bob/5/2/2_10.f',\n", + " '/home/dave/test_tree/bob/5/2/2_5.f',\n", + " '/home/dave/test_tree/bob/5/2/2_4.f',\n", + " '/home/dave/test_tree/bob/5/2/2_3.f',\n", + " '/home/dave/test_tree/bob/5/2/2_7.f',\n", + " '/home/dave/test_tree/bob/5/2/2_8.f'],\n", + " ['/home/dave/test_tree/bob/5/10/10_10.f',\n", + " '/home/dave/test_tree/bob/5/10/10_8.f',\n", + " '/home/dave/test_tree/bob/5/10/10_3.f',\n", + " '/home/dave/test_tree/bob/5/10/10_4.f',\n", + " '/home/dave/test_tree/bob/5/10/10_1.f',\n", + " '/home/dave/test_tree/bob/5/10/10_9.f',\n", + " '/home/dave/test_tree/bob/5/10/10_6.f',\n", + " '/home/dave/test_tree/bob/5/10/10_7.f',\n", + " '/home/dave/test_tree/bob/5/10/10_5.f',\n", + " '/home/dave/test_tree/bob/5/10/10_2.f'],\n", + " ['/home/dave/test_tree/bob/5/8/8_2.f',\n", + " '/home/dave/test_tree/bob/5/8/8_8.f',\n", + " '/home/dave/test_tree/bob/5/8/8_9.f',\n", + " '/home/dave/test_tree/bob/5/8/8_7.f',\n", + " '/home/dave/test_tree/bob/5/8/8_4.f',\n", + " '/home/dave/test_tree/bob/5/8/8_1.f',\n", + " '/home/dave/test_tree/bob/5/8/8_3.f',\n", + " '/home/dave/test_tree/bob/5/8/8_10.f',\n", + " '/home/dave/test_tree/bob/5/8/8_6.f',\n", + " '/home/dave/test_tree/bob/5/8/8_5.f'],\n", + " ['/home/dave/test_tree/bob/5/4/4_5.f',\n", + " '/home/dave/test_tree/bob/5/4/4_7.f',\n", + " '/home/dave/test_tree/bob/5/4/4_4.f',\n", + " '/home/dave/test_tree/bob/5/4/4_6.f',\n", + " '/home/dave/test_tree/bob/5/4/4_8.f',\n", + " '/home/dave/test_tree/bob/5/4/4_3.f',\n", + " '/home/dave/test_tree/bob/5/4/4_9.f',\n", + " '/home/dave/test_tree/bob/5/4/4_2.f',\n", + " '/home/dave/test_tree/bob/5/4/4_10.f',\n", + " '/home/dave/test_tree/bob/5/4/4_1.f'],\n", + " ['/home/dave/test_tree/bob/5/9/9_4.f',\n", + " '/home/dave/test_tree/bob/5/9/9_5.f',\n", + " '/home/dave/test_tree/bob/5/9/9_8.f',\n", + " '/home/dave/test_tree/bob/5/9/9_7.f',\n", + " '/home/dave/test_tree/bob/5/9/9_6.f',\n", + " '/home/dave/test_tree/bob/5/9/9_1.f',\n", + " '/home/dave/test_tree/bob/5/9/9_10.f',\n", + " '/home/dave/test_tree/bob/5/9/9_2.f',\n", + " '/home/dave/test_tree/bob/5/9/9_3.f',\n", + " '/home/dave/test_tree/bob/5/9/9_9.f'],\n", + " ['/home/dave/test_tree/bob/5/6/6_6.f',\n", + " '/home/dave/test_tree/bob/5/6/6_4.f',\n", + " '/home/dave/test_tree/bob/5/6/6_3.f',\n", + " '/home/dave/test_tree/bob/5/6/6_5.f',\n", + " '/home/dave/test_tree/bob/5/6/6_8.f',\n", + " '/home/dave/test_tree/bob/5/6/6_1.f',\n", + " '/home/dave/test_tree/bob/5/6/6_10.f',\n", + " '/home/dave/test_tree/bob/5/6/6_9.f',\n", + " '/home/dave/test_tree/bob/5/6/6_7.f',\n", + " '/home/dave/test_tree/bob/5/6/6_2.f'],\n", + " ['/home/dave/test_tree/bob/5/1/1_6.f',\n", + " '/home/dave/test_tree/bob/5/1/1_9.f',\n", + " '/home/dave/test_tree/bob/5/1/1_10.f',\n", + " '/home/dave/test_tree/bob/5/1/1_1.f',\n", + " '/home/dave/test_tree/bob/5/1/1_3.f',\n", + " '/home/dave/test_tree/bob/5/1/1_7.f',\n", + " '/home/dave/test_tree/bob/5/1/1_5.f',\n", + " '/home/dave/test_tree/bob/5/1/1_2.f',\n", + " '/home/dave/test_tree/bob/5/1/1_4.f',\n", + " '/home/dave/test_tree/bob/5/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bob',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bob/2': {'parent_folder': '/home/dave/test_tree/bob/2',\n", + " 'folders': ['/home/dave/test_tree/bob/2/3',\n", + " '/home/dave/test_tree/bob/2/7',\n", + " '/home/dave/test_tree/bob/2/5',\n", + " '/home/dave/test_tree/bob/2/2',\n", + " '/home/dave/test_tree/bob/2/10',\n", + " '/home/dave/test_tree/bob/2/8',\n", + " '/home/dave/test_tree/bob/2/4',\n", + " '/home/dave/test_tree/bob/2/9',\n", + " '/home/dave/test_tree/bob/2/6',\n", + " '/home/dave/test_tree/bob/2/1'],\n", + " 'object_names': [['test_tree/bob/2/3/3_7.f',\n", + " 'test_tree/bob/2/3/3_9.f',\n", + " 'test_tree/bob/2/3/3_8.f',\n", + " 'test_tree/bob/2/3/3_5.f',\n", + " 'test_tree/bob/2/3/3_6.f',\n", + " 'test_tree/bob/2/3/3_4.f',\n", + " 'test_tree/bob/2/3/3_2.f',\n", + " 'test_tree/bob/2/3/3_3.f',\n", + " 'test_tree/bob/2/3/3_10.f',\n", + " 'test_tree/bob/2/3/3_1.f'],\n", + " ['test_tree/bob/2/7/7_10.f',\n", + " 'test_tree/bob/2/7/7_7.f',\n", + " 'test_tree/bob/2/7/7_6.f',\n", + " 'test_tree/bob/2/7/7_8.f',\n", + " 'test_tree/bob/2/7/7_9.f',\n", + " 'test_tree/bob/2/7/7_3.f',\n", + " 'test_tree/bob/2/7/7_1.f',\n", + " 'test_tree/bob/2/7/7_4.f',\n", + " 'test_tree/bob/2/7/7_2.f',\n", + " 'test_tree/bob/2/7/7_5.f'],\n", + " ['test_tree/bob/2/5/5_9.f',\n", + " 'test_tree/bob/2/5/5_10.f',\n", + " 'test_tree/bob/2/5/5_8.f',\n", + " 'test_tree/bob/2/5/5_1.f',\n", + " 'test_tree/bob/2/5/5_5.f',\n", + " 'test_tree/bob/2/5/5_2.f',\n", + " 'test_tree/bob/2/5/5_6.f',\n", + " 'test_tree/bob/2/5/5_3.f',\n", + " 'test_tree/bob/2/5/5_4.f',\n", + " 'test_tree/bob/2/5/5_7.f'],\n", + " ['test_tree/bob/2/2/2_6.f',\n", + " 'test_tree/bob/2/2/2_1.f',\n", + " 'test_tree/bob/2/2/2_9.f',\n", + " 'test_tree/bob/2/2/2_2.f',\n", + " 'test_tree/bob/2/2/2_10.f',\n", + " 'test_tree/bob/2/2/2_5.f',\n", + " 'test_tree/bob/2/2/2_4.f',\n", + " 'test_tree/bob/2/2/2_3.f',\n", + " 'test_tree/bob/2/2/2_7.f',\n", + " 'test_tree/bob/2/2/2_8.f'],\n", + " ['test_tree/bob/2/10/10_10.f',\n", + " 'test_tree/bob/2/10/10_8.f',\n", + " 'test_tree/bob/2/10/10_3.f',\n", + " 'test_tree/bob/2/10/10_4.f',\n", + " 'test_tree/bob/2/10/10_1.f',\n", + " 'test_tree/bob/2/10/10_9.f',\n", + " 'test_tree/bob/2/10/10_6.f',\n", + " 'test_tree/bob/2/10/10_7.f',\n", + " 'test_tree/bob/2/10/10_5.f',\n", + " 'test_tree/bob/2/10/10_2.f'],\n", + " ['test_tree/bob/2/8/8_2.f',\n", + " 'test_tree/bob/2/8/8_8.f',\n", + " 'test_tree/bob/2/8/8_9.f',\n", + " 'test_tree/bob/2/8/8_7.f',\n", + " 'test_tree/bob/2/8/8_4.f',\n", + " 'test_tree/bob/2/8/8_1.f',\n", + " 'test_tree/bob/2/8/8_3.f',\n", + " 'test_tree/bob/2/8/8_10.f',\n", + " 'test_tree/bob/2/8/8_6.f',\n", + " 'test_tree/bob/2/8/8_5.f'],\n", + " ['test_tree/bob/2/4/4_5.f',\n", + " 'test_tree/bob/2/4/4_7.f',\n", + " 'test_tree/bob/2/4/4_4.f',\n", + " 'test_tree/bob/2/4/4_6.f',\n", + " 'test_tree/bob/2/4/4_8.f',\n", + " 'test_tree/bob/2/4/4_3.f',\n", + " 'test_tree/bob/2/4/4_9.f',\n", + " 'test_tree/bob/2/4/4_2.f',\n", + " 'test_tree/bob/2/4/4_10.f',\n", + " 'test_tree/bob/2/4/4_1.f'],\n", + " ['test_tree/bob/2/9/9_4.f',\n", + " 'test_tree/bob/2/9/9_5.f',\n", + " 'test_tree/bob/2/9/9_8.f',\n", + " 'test_tree/bob/2/9/9_7.f',\n", + " 'test_tree/bob/2/9/9_6.f',\n", + " 'test_tree/bob/2/9/9_1.f',\n", + " 'test_tree/bob/2/9/9_10.f',\n", + " 'test_tree/bob/2/9/9_2.f',\n", + " 'test_tree/bob/2/9/9_3.f',\n", + " 'test_tree/bob/2/9/9_9.f'],\n", + " ['test_tree/bob/2/6/6_6.f',\n", + " 'test_tree/bob/2/6/6_4.f',\n", + " 'test_tree/bob/2/6/6_3.f',\n", + " 'test_tree/bob/2/6/6_5.f',\n", + " 'test_tree/bob/2/6/6_8.f',\n", + " 'test_tree/bob/2/6/6_1.f',\n", + " 'test_tree/bob/2/6/6_10.f',\n", + " 'test_tree/bob/2/6/6_9.f',\n", + " 'test_tree/bob/2/6/6_7.f',\n", + " 'test_tree/bob/2/6/6_2.f'],\n", + " ['test_tree/bob/2/1/1_6.f',\n", + " 'test_tree/bob/2/1/1_9.f',\n", + " 'test_tree/bob/2/1/1_10.f',\n", + " 'test_tree/bob/2/1/1_1.f',\n", + " 'test_tree/bob/2/1/1_3.f',\n", + " 'test_tree/bob/2/1/1_7.f',\n", + " 'test_tree/bob/2/1/1_5.f',\n", + " 'test_tree/bob/2/1/1_2.f',\n", + " 'test_tree/bob/2/1/1_4.f',\n", + " 'test_tree/bob/2/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bob/2/3/3_7.f',\n", + " '/home/dave/test_tree/bob/2/3/3_9.f',\n", + " '/home/dave/test_tree/bob/2/3/3_8.f',\n", + " '/home/dave/test_tree/bob/2/3/3_5.f',\n", + " '/home/dave/test_tree/bob/2/3/3_6.f',\n", + " '/home/dave/test_tree/bob/2/3/3_4.f',\n", + " '/home/dave/test_tree/bob/2/3/3_2.f',\n", + " '/home/dave/test_tree/bob/2/3/3_3.f',\n", + " '/home/dave/test_tree/bob/2/3/3_10.f',\n", + " '/home/dave/test_tree/bob/2/3/3_1.f'],\n", + " ['/home/dave/test_tree/bob/2/7/7_10.f',\n", + " '/home/dave/test_tree/bob/2/7/7_7.f',\n", + " '/home/dave/test_tree/bob/2/7/7_6.f',\n", + " '/home/dave/test_tree/bob/2/7/7_8.f',\n", + " '/home/dave/test_tree/bob/2/7/7_9.f',\n", + " '/home/dave/test_tree/bob/2/7/7_3.f',\n", + " '/home/dave/test_tree/bob/2/7/7_1.f',\n", + " '/home/dave/test_tree/bob/2/7/7_4.f',\n", + " '/home/dave/test_tree/bob/2/7/7_2.f',\n", + " '/home/dave/test_tree/bob/2/7/7_5.f'],\n", + " ['/home/dave/test_tree/bob/2/5/5_9.f',\n", + " '/home/dave/test_tree/bob/2/5/5_10.f',\n", + " '/home/dave/test_tree/bob/2/5/5_8.f',\n", + " '/home/dave/test_tree/bob/2/5/5_1.f',\n", + " '/home/dave/test_tree/bob/2/5/5_5.f',\n", + " '/home/dave/test_tree/bob/2/5/5_2.f',\n", + " '/home/dave/test_tree/bob/2/5/5_6.f',\n", + " '/home/dave/test_tree/bob/2/5/5_3.f',\n", + " '/home/dave/test_tree/bob/2/5/5_4.f',\n", + " '/home/dave/test_tree/bob/2/5/5_7.f'],\n", + " ['/home/dave/test_tree/bob/2/2/2_6.f',\n", + " '/home/dave/test_tree/bob/2/2/2_1.f',\n", + " '/home/dave/test_tree/bob/2/2/2_9.f',\n", + " '/home/dave/test_tree/bob/2/2/2_2.f',\n", + " '/home/dave/test_tree/bob/2/2/2_10.f',\n", + " '/home/dave/test_tree/bob/2/2/2_5.f',\n", + " '/home/dave/test_tree/bob/2/2/2_4.f',\n", + " '/home/dave/test_tree/bob/2/2/2_3.f',\n", + " '/home/dave/test_tree/bob/2/2/2_7.f',\n", + " '/home/dave/test_tree/bob/2/2/2_8.f'],\n", + " ['/home/dave/test_tree/bob/2/10/10_10.f',\n", + " '/home/dave/test_tree/bob/2/10/10_8.f',\n", + " '/home/dave/test_tree/bob/2/10/10_3.f',\n", + " '/home/dave/test_tree/bob/2/10/10_4.f',\n", + " '/home/dave/test_tree/bob/2/10/10_1.f',\n", + " '/home/dave/test_tree/bob/2/10/10_9.f',\n", + " '/home/dave/test_tree/bob/2/10/10_6.f',\n", + " '/home/dave/test_tree/bob/2/10/10_7.f',\n", + " '/home/dave/test_tree/bob/2/10/10_5.f',\n", + " '/home/dave/test_tree/bob/2/10/10_2.f'],\n", + " ['/home/dave/test_tree/bob/2/8/8_2.f',\n", + " '/home/dave/test_tree/bob/2/8/8_8.f',\n", + " '/home/dave/test_tree/bob/2/8/8_9.f',\n", + " '/home/dave/test_tree/bob/2/8/8_7.f',\n", + " '/home/dave/test_tree/bob/2/8/8_4.f',\n", + " '/home/dave/test_tree/bob/2/8/8_1.f',\n", + " '/home/dave/test_tree/bob/2/8/8_3.f',\n", + " '/home/dave/test_tree/bob/2/8/8_10.f',\n", + " '/home/dave/test_tree/bob/2/8/8_6.f',\n", + " '/home/dave/test_tree/bob/2/8/8_5.f'],\n", + " ['/home/dave/test_tree/bob/2/4/4_5.f',\n", + " '/home/dave/test_tree/bob/2/4/4_7.f',\n", + " '/home/dave/test_tree/bob/2/4/4_4.f',\n", + " '/home/dave/test_tree/bob/2/4/4_6.f',\n", + " '/home/dave/test_tree/bob/2/4/4_8.f',\n", + " '/home/dave/test_tree/bob/2/4/4_3.f',\n", + " '/home/dave/test_tree/bob/2/4/4_9.f',\n", + " '/home/dave/test_tree/bob/2/4/4_2.f',\n", + " '/home/dave/test_tree/bob/2/4/4_10.f',\n", + " '/home/dave/test_tree/bob/2/4/4_1.f'],\n", + " ['/home/dave/test_tree/bob/2/9/9_4.f',\n", + " '/home/dave/test_tree/bob/2/9/9_5.f',\n", + " '/home/dave/test_tree/bob/2/9/9_8.f',\n", + " '/home/dave/test_tree/bob/2/9/9_7.f',\n", + " '/home/dave/test_tree/bob/2/9/9_6.f',\n", + " '/home/dave/test_tree/bob/2/9/9_1.f',\n", + " '/home/dave/test_tree/bob/2/9/9_10.f',\n", + " '/home/dave/test_tree/bob/2/9/9_2.f',\n", + " '/home/dave/test_tree/bob/2/9/9_3.f',\n", + " '/home/dave/test_tree/bob/2/9/9_9.f'],\n", + " ['/home/dave/test_tree/bob/2/6/6_6.f',\n", + " '/home/dave/test_tree/bob/2/6/6_4.f',\n", + " '/home/dave/test_tree/bob/2/6/6_3.f',\n", + " '/home/dave/test_tree/bob/2/6/6_5.f',\n", + " '/home/dave/test_tree/bob/2/6/6_8.f',\n", + " '/home/dave/test_tree/bob/2/6/6_1.f',\n", + " '/home/dave/test_tree/bob/2/6/6_10.f',\n", + " '/home/dave/test_tree/bob/2/6/6_9.f',\n", + " '/home/dave/test_tree/bob/2/6/6_7.f',\n", + " '/home/dave/test_tree/bob/2/6/6_2.f'],\n", + " ['/home/dave/test_tree/bob/2/1/1_6.f',\n", + " '/home/dave/test_tree/bob/2/1/1_9.f',\n", + " '/home/dave/test_tree/bob/2/1/1_10.f',\n", + " '/home/dave/test_tree/bob/2/1/1_1.f',\n", + " '/home/dave/test_tree/bob/2/1/1_3.f',\n", + " '/home/dave/test_tree/bob/2/1/1_7.f',\n", + " '/home/dave/test_tree/bob/2/1/1_5.f',\n", + " '/home/dave/test_tree/bob/2/1/1_2.f',\n", + " '/home/dave/test_tree/bob/2/1/1_4.f',\n", + " '/home/dave/test_tree/bob/2/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bob',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bob/4': {'parent_folder': '/home/dave/test_tree/bob/4',\n", + " 'folders': ['/home/dave/test_tree/bob/4/3',\n", + " '/home/dave/test_tree/bob/4/7',\n", + " '/home/dave/test_tree/bob/4/5',\n", + " '/home/dave/test_tree/bob/4/2',\n", + " '/home/dave/test_tree/bob/4/10',\n", + " '/home/dave/test_tree/bob/4/8',\n", + " '/home/dave/test_tree/bob/4/4',\n", + " '/home/dave/test_tree/bob/4/9',\n", + " '/home/dave/test_tree/bob/4/6',\n", + " '/home/dave/test_tree/bob/4/1'],\n", + " 'object_names': [['test_tree/bob/4/3/3_7.f',\n", + " 'test_tree/bob/4/3/3_9.f',\n", + " 'test_tree/bob/4/3/3_8.f',\n", + " 'test_tree/bob/4/3/3_5.f',\n", + " 'test_tree/bob/4/3/3_6.f',\n", + " 'test_tree/bob/4/3/3_4.f',\n", + " 'test_tree/bob/4/3/3_2.f',\n", + " 'test_tree/bob/4/3/3_3.f',\n", + " 'test_tree/bob/4/3/3_10.f',\n", + " 'test_tree/bob/4/3/3_1.f'],\n", + " ['test_tree/bob/4/7/7_10.f',\n", + " 'test_tree/bob/4/7/7_7.f',\n", + " 'test_tree/bob/4/7/7_6.f',\n", + " 'test_tree/bob/4/7/7_8.f',\n", + " 'test_tree/bob/4/7/7_9.f',\n", + " 'test_tree/bob/4/7/7_3.f',\n", + " 'test_tree/bob/4/7/7_1.f',\n", + " 'test_tree/bob/4/7/7_4.f',\n", + " 'test_tree/bob/4/7/7_2.f',\n", + " 'test_tree/bob/4/7/7_5.f'],\n", + " ['test_tree/bob/4/5/5_9.f',\n", + " 'test_tree/bob/4/5/5_10.f',\n", + " 'test_tree/bob/4/5/5_8.f',\n", + " 'test_tree/bob/4/5/5_1.f',\n", + " 'test_tree/bob/4/5/5_5.f',\n", + " 'test_tree/bob/4/5/5_2.f',\n", + " 'test_tree/bob/4/5/5_6.f',\n", + " 'test_tree/bob/4/5/5_3.f',\n", + " 'test_tree/bob/4/5/5_4.f',\n", + " 'test_tree/bob/4/5/5_7.f'],\n", + " ['test_tree/bob/4/2/2_6.f',\n", + " 'test_tree/bob/4/2/2_1.f',\n", + " 'test_tree/bob/4/2/2_9.f',\n", + " 'test_tree/bob/4/2/2_2.f',\n", + " 'test_tree/bob/4/2/2_10.f',\n", + " 'test_tree/bob/4/2/2_5.f',\n", + " 'test_tree/bob/4/2/2_4.f',\n", + " 'test_tree/bob/4/2/2_3.f',\n", + " 'test_tree/bob/4/2/2_7.f',\n", + " 'test_tree/bob/4/2/2_8.f'],\n", + " ['test_tree/bob/4/10/10_10.f',\n", + " 'test_tree/bob/4/10/10_8.f',\n", + " 'test_tree/bob/4/10/10_3.f',\n", + " 'test_tree/bob/4/10/10_4.f',\n", + " 'test_tree/bob/4/10/10_1.f',\n", + " 'test_tree/bob/4/10/10_9.f',\n", + " 'test_tree/bob/4/10/10_6.f',\n", + " 'test_tree/bob/4/10/10_7.f',\n", + " 'test_tree/bob/4/10/10_5.f',\n", + " 'test_tree/bob/4/10/10_2.f'],\n", + " ['test_tree/bob/4/8/8_2.f',\n", + " 'test_tree/bob/4/8/8_8.f',\n", + " 'test_tree/bob/4/8/8_9.f',\n", + " 'test_tree/bob/4/8/8_7.f',\n", + " 'test_tree/bob/4/8/8_4.f',\n", + " 'test_tree/bob/4/8/8_1.f',\n", + " 'test_tree/bob/4/8/8_3.f',\n", + " 'test_tree/bob/4/8/8_10.f',\n", + " 'test_tree/bob/4/8/8_6.f',\n", + " 'test_tree/bob/4/8/8_5.f'],\n", + " ['test_tree/bob/4/4/4_5.f',\n", + " 'test_tree/bob/4/4/4_7.f',\n", + " 'test_tree/bob/4/4/4_4.f',\n", + " 'test_tree/bob/4/4/4_6.f',\n", + " 'test_tree/bob/4/4/4_8.f',\n", + " 'test_tree/bob/4/4/4_3.f',\n", + " 'test_tree/bob/4/4/4_9.f',\n", + " 'test_tree/bob/4/4/4_2.f',\n", + " 'test_tree/bob/4/4/4_10.f',\n", + " 'test_tree/bob/4/4/4_1.f'],\n", + " ['test_tree/bob/4/9/9_4.f',\n", + " 'test_tree/bob/4/9/9_5.f',\n", + " 'test_tree/bob/4/9/9_8.f',\n", + " 'test_tree/bob/4/9/9_7.f',\n", + " 'test_tree/bob/4/9/9_6.f',\n", + " 'test_tree/bob/4/9/9_1.f',\n", + " 'test_tree/bob/4/9/9_10.f',\n", + " 'test_tree/bob/4/9/9_2.f',\n", + " 'test_tree/bob/4/9/9_3.f',\n", + " 'test_tree/bob/4/9/9_9.f'],\n", + " ['test_tree/bob/4/6/6_6.f',\n", + " 'test_tree/bob/4/6/6_4.f',\n", + " 'test_tree/bob/4/6/6_3.f',\n", + " 'test_tree/bob/4/6/6_5.f',\n", + " 'test_tree/bob/4/6/6_8.f',\n", + " 'test_tree/bob/4/6/6_1.f',\n", + " 'test_tree/bob/4/6/6_10.f',\n", + " 'test_tree/bob/4/6/6_9.f',\n", + " 'test_tree/bob/4/6/6_7.f',\n", + " 'test_tree/bob/4/6/6_2.f'],\n", + " ['test_tree/bob/4/1/1_6.f',\n", + " 'test_tree/bob/4/1/1_9.f',\n", + " 'test_tree/bob/4/1/1_10.f',\n", + " 'test_tree/bob/4/1/1_1.f',\n", + " 'test_tree/bob/4/1/1_3.f',\n", + " 'test_tree/bob/4/1/1_7.f',\n", + " 'test_tree/bob/4/1/1_5.f',\n", + " 'test_tree/bob/4/1/1_2.f',\n", + " 'test_tree/bob/4/1/1_4.f',\n", + " 'test_tree/bob/4/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bob/4/3/3_7.f',\n", + " '/home/dave/test_tree/bob/4/3/3_9.f',\n", + " '/home/dave/test_tree/bob/4/3/3_8.f',\n", + " '/home/dave/test_tree/bob/4/3/3_5.f',\n", + " '/home/dave/test_tree/bob/4/3/3_6.f',\n", + " '/home/dave/test_tree/bob/4/3/3_4.f',\n", + " '/home/dave/test_tree/bob/4/3/3_2.f',\n", + " '/home/dave/test_tree/bob/4/3/3_3.f',\n", + " '/home/dave/test_tree/bob/4/3/3_10.f',\n", + " '/home/dave/test_tree/bob/4/3/3_1.f'],\n", + " ['/home/dave/test_tree/bob/4/7/7_10.f',\n", + " '/home/dave/test_tree/bob/4/7/7_7.f',\n", + " '/home/dave/test_tree/bob/4/7/7_6.f',\n", + " '/home/dave/test_tree/bob/4/7/7_8.f',\n", + " '/home/dave/test_tree/bob/4/7/7_9.f',\n", + " '/home/dave/test_tree/bob/4/7/7_3.f',\n", + " '/home/dave/test_tree/bob/4/7/7_1.f',\n", + " '/home/dave/test_tree/bob/4/7/7_4.f',\n", + " '/home/dave/test_tree/bob/4/7/7_2.f',\n", + " '/home/dave/test_tree/bob/4/7/7_5.f'],\n", + " ['/home/dave/test_tree/bob/4/5/5_9.f',\n", + " '/home/dave/test_tree/bob/4/5/5_10.f',\n", + " '/home/dave/test_tree/bob/4/5/5_8.f',\n", + " '/home/dave/test_tree/bob/4/5/5_1.f',\n", + " '/home/dave/test_tree/bob/4/5/5_5.f',\n", + " '/home/dave/test_tree/bob/4/5/5_2.f',\n", + " '/home/dave/test_tree/bob/4/5/5_6.f',\n", + " '/home/dave/test_tree/bob/4/5/5_3.f',\n", + " '/home/dave/test_tree/bob/4/5/5_4.f',\n", + " '/home/dave/test_tree/bob/4/5/5_7.f'],\n", + " ['/home/dave/test_tree/bob/4/2/2_6.f',\n", + " '/home/dave/test_tree/bob/4/2/2_1.f',\n", + " '/home/dave/test_tree/bob/4/2/2_9.f',\n", + " '/home/dave/test_tree/bob/4/2/2_2.f',\n", + " '/home/dave/test_tree/bob/4/2/2_10.f',\n", + " '/home/dave/test_tree/bob/4/2/2_5.f',\n", + " '/home/dave/test_tree/bob/4/2/2_4.f',\n", + " '/home/dave/test_tree/bob/4/2/2_3.f',\n", + " '/home/dave/test_tree/bob/4/2/2_7.f',\n", + " '/home/dave/test_tree/bob/4/2/2_8.f'],\n", + " ['/home/dave/test_tree/bob/4/10/10_10.f',\n", + " '/home/dave/test_tree/bob/4/10/10_8.f',\n", + " '/home/dave/test_tree/bob/4/10/10_3.f',\n", + " '/home/dave/test_tree/bob/4/10/10_4.f',\n", + " '/home/dave/test_tree/bob/4/10/10_1.f',\n", + " '/home/dave/test_tree/bob/4/10/10_9.f',\n", + " '/home/dave/test_tree/bob/4/10/10_6.f',\n", + " '/home/dave/test_tree/bob/4/10/10_7.f',\n", + " '/home/dave/test_tree/bob/4/10/10_5.f',\n", + " '/home/dave/test_tree/bob/4/10/10_2.f'],\n", + " ['/home/dave/test_tree/bob/4/8/8_2.f',\n", + " '/home/dave/test_tree/bob/4/8/8_8.f',\n", + " '/home/dave/test_tree/bob/4/8/8_9.f',\n", + " '/home/dave/test_tree/bob/4/8/8_7.f',\n", + " '/home/dave/test_tree/bob/4/8/8_4.f',\n", + " '/home/dave/test_tree/bob/4/8/8_1.f',\n", + " '/home/dave/test_tree/bob/4/8/8_3.f',\n", + " '/home/dave/test_tree/bob/4/8/8_10.f',\n", + " '/home/dave/test_tree/bob/4/8/8_6.f',\n", + " '/home/dave/test_tree/bob/4/8/8_5.f'],\n", + " ['/home/dave/test_tree/bob/4/4/4_5.f',\n", + " '/home/dave/test_tree/bob/4/4/4_7.f',\n", + " '/home/dave/test_tree/bob/4/4/4_4.f',\n", + " '/home/dave/test_tree/bob/4/4/4_6.f',\n", + " '/home/dave/test_tree/bob/4/4/4_8.f',\n", + " '/home/dave/test_tree/bob/4/4/4_3.f',\n", + " '/home/dave/test_tree/bob/4/4/4_9.f',\n", + " '/home/dave/test_tree/bob/4/4/4_2.f',\n", + " '/home/dave/test_tree/bob/4/4/4_10.f',\n", + " '/home/dave/test_tree/bob/4/4/4_1.f'],\n", + " ['/home/dave/test_tree/bob/4/9/9_4.f',\n", + " '/home/dave/test_tree/bob/4/9/9_5.f',\n", + " '/home/dave/test_tree/bob/4/9/9_8.f',\n", + " '/home/dave/test_tree/bob/4/9/9_7.f',\n", + " '/home/dave/test_tree/bob/4/9/9_6.f',\n", + " '/home/dave/test_tree/bob/4/9/9_1.f',\n", + " '/home/dave/test_tree/bob/4/9/9_10.f',\n", + " '/home/dave/test_tree/bob/4/9/9_2.f',\n", + " '/home/dave/test_tree/bob/4/9/9_3.f',\n", + " '/home/dave/test_tree/bob/4/9/9_9.f'],\n", + " ['/home/dave/test_tree/bob/4/6/6_6.f',\n", + " '/home/dave/test_tree/bob/4/6/6_4.f',\n", + " '/home/dave/test_tree/bob/4/6/6_3.f',\n", + " '/home/dave/test_tree/bob/4/6/6_5.f',\n", + " '/home/dave/test_tree/bob/4/6/6_8.f',\n", + " '/home/dave/test_tree/bob/4/6/6_1.f',\n", + " '/home/dave/test_tree/bob/4/6/6_10.f',\n", + " '/home/dave/test_tree/bob/4/6/6_9.f',\n", + " '/home/dave/test_tree/bob/4/6/6_7.f',\n", + " '/home/dave/test_tree/bob/4/6/6_2.f'],\n", + " ['/home/dave/test_tree/bob/4/1/1_6.f',\n", + " '/home/dave/test_tree/bob/4/1/1_9.f',\n", + " '/home/dave/test_tree/bob/4/1/1_10.f',\n", + " '/home/dave/test_tree/bob/4/1/1_1.f',\n", + " '/home/dave/test_tree/bob/4/1/1_3.f',\n", + " '/home/dave/test_tree/bob/4/1/1_7.f',\n", + " '/home/dave/test_tree/bob/4/1/1_5.f',\n", + " '/home/dave/test_tree/bob/4/1/1_2.f',\n", + " '/home/dave/test_tree/bob/4/1/1_4.f',\n", + " '/home/dave/test_tree/bob/4/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bob',\n", + " 'size': 10485760},\n", + " '/home/dave/test_tree/bob/1': {'parent_folder': '/home/dave/test_tree/bob/1',\n", + " 'folders': ['/home/dave/test_tree/bob/1/3',\n", + " '/home/dave/test_tree/bob/1/7',\n", + " '/home/dave/test_tree/bob/1/5',\n", + " '/home/dave/test_tree/bob/1/2',\n", + " '/home/dave/test_tree/bob/1/10',\n", + " '/home/dave/test_tree/bob/1/8',\n", + " '/home/dave/test_tree/bob/1/4',\n", + " '/home/dave/test_tree/bob/1/9',\n", + " '/home/dave/test_tree/bob/1/6',\n", + " '/home/dave/test_tree/bob/1/1'],\n", + " 'object_names': [['test_tree/bob/1/3/3_7.f',\n", + " 'test_tree/bob/1/3/3_9.f',\n", + " 'test_tree/bob/1/3/3_8.f',\n", + " 'test_tree/bob/1/3/3_5.f',\n", + " 'test_tree/bob/1/3/3_6.f',\n", + " 'test_tree/bob/1/3/3_4.f',\n", + " 'test_tree/bob/1/3/3_2.f',\n", + " 'test_tree/bob/1/3/3_3.f',\n", + " 'test_tree/bob/1/3/3_10.f',\n", + " 'test_tree/bob/1/3/3_1.f'],\n", + " ['test_tree/bob/1/7/7_10.f',\n", + " 'test_tree/bob/1/7/7_7.f',\n", + " 'test_tree/bob/1/7/7_6.f',\n", + " 'test_tree/bob/1/7/7_8.f',\n", + " 'test_tree/bob/1/7/7_9.f',\n", + " 'test_tree/bob/1/7/7_3.f',\n", + " 'test_tree/bob/1/7/7_1.f',\n", + " 'test_tree/bob/1/7/7_4.f',\n", + " 'test_tree/bob/1/7/7_2.f',\n", + " 'test_tree/bob/1/7/7_5.f'],\n", + " ['test_tree/bob/1/5/5_9.f',\n", + " 'test_tree/bob/1/5/5_10.f',\n", + " 'test_tree/bob/1/5/5_8.f',\n", + " 'test_tree/bob/1/5/5_1.f',\n", + " 'test_tree/bob/1/5/5_5.f',\n", + " 'test_tree/bob/1/5/5_2.f',\n", + " 'test_tree/bob/1/5/5_6.f',\n", + " 'test_tree/bob/1/5/5_3.f',\n", + " 'test_tree/bob/1/5/5_4.f',\n", + " 'test_tree/bob/1/5/5_7.f'],\n", + " ['test_tree/bob/1/2/2_6.f',\n", + " 'test_tree/bob/1/2/2_1.f',\n", + " 'test_tree/bob/1/2/2_9.f',\n", + " 'test_tree/bob/1/2/2_2.f',\n", + " 'test_tree/bob/1/2/2_10.f',\n", + " 'test_tree/bob/1/2/2_5.f',\n", + " 'test_tree/bob/1/2/2_4.f',\n", + " 'test_tree/bob/1/2/2_3.f',\n", + " 'test_tree/bob/1/2/2_7.f',\n", + " 'test_tree/bob/1/2/2_8.f'],\n", + " ['test_tree/bob/1/10/10_10.f',\n", + " 'test_tree/bob/1/10/10_8.f',\n", + " 'test_tree/bob/1/10/10_3.f',\n", + " 'test_tree/bob/1/10/10_4.f',\n", + " 'test_tree/bob/1/10/10_1.f',\n", + " 'test_tree/bob/1/10/10_9.f',\n", + " 'test_tree/bob/1/10/10_6.f',\n", + " 'test_tree/bob/1/10/10_7.f',\n", + " 'test_tree/bob/1/10/10_5.f',\n", + " 'test_tree/bob/1/10/10_2.f'],\n", + " ['test_tree/bob/1/8/8_2.f',\n", + " 'test_tree/bob/1/8/8_8.f',\n", + " 'test_tree/bob/1/8/8_9.f',\n", + " 'test_tree/bob/1/8/8_7.f',\n", + " 'test_tree/bob/1/8/8_4.f',\n", + " 'test_tree/bob/1/8/8_1.f',\n", + " 'test_tree/bob/1/8/8_3.f',\n", + " 'test_tree/bob/1/8/8_10.f',\n", + " 'test_tree/bob/1/8/8_6.f',\n", + " 'test_tree/bob/1/8/8_5.f'],\n", + " ['test_tree/bob/1/4/4_5.f',\n", + " 'test_tree/bob/1/4/4_7.f',\n", + " 'test_tree/bob/1/4/4_4.f',\n", + " 'test_tree/bob/1/4/4_6.f',\n", + " 'test_tree/bob/1/4/4_8.f',\n", + " 'test_tree/bob/1/4/4_3.f',\n", + " 'test_tree/bob/1/4/4_9.f',\n", + " 'test_tree/bob/1/4/4_2.f',\n", + " 'test_tree/bob/1/4/4_10.f',\n", + " 'test_tree/bob/1/4/4_1.f'],\n", + " ['test_tree/bob/1/9/9_4.f',\n", + " 'test_tree/bob/1/9/9_5.f',\n", + " 'test_tree/bob/1/9/9_8.f',\n", + " 'test_tree/bob/1/9/9_7.f',\n", + " 'test_tree/bob/1/9/9_6.f',\n", + " 'test_tree/bob/1/9/9_1.f',\n", + " 'test_tree/bob/1/9/9_10.f',\n", + " 'test_tree/bob/1/9/9_2.f',\n", + " 'test_tree/bob/1/9/9_3.f',\n", + " 'test_tree/bob/1/9/9_9.f'],\n", + " ['test_tree/bob/1/6/6_6.f',\n", + " 'test_tree/bob/1/6/6_4.f',\n", + " 'test_tree/bob/1/6/6_3.f',\n", + " 'test_tree/bob/1/6/6_5.f',\n", + " 'test_tree/bob/1/6/6_8.f',\n", + " 'test_tree/bob/1/6/6_1.f',\n", + " 'test_tree/bob/1/6/6_10.f',\n", + " 'test_tree/bob/1/6/6_9.f',\n", + " 'test_tree/bob/1/6/6_7.f',\n", + " 'test_tree/bob/1/6/6_2.f'],\n", + " ['test_tree/bob/1/1/1_6.f',\n", + " 'test_tree/bob/1/1/1_9.f',\n", + " 'test_tree/bob/1/1/1_10.f',\n", + " 'test_tree/bob/1/1/1_1.f',\n", + " 'test_tree/bob/1/1/1_3.f',\n", + " 'test_tree/bob/1/1/1_7.f',\n", + " 'test_tree/bob/1/1/1_5.f',\n", + " 'test_tree/bob/1/1/1_2.f',\n", + " 'test_tree/bob/1/1/1_4.f',\n", + " 'test_tree/bob/1/1/1_8.f']],\n", + " 'folder_files': [['/home/dave/test_tree/bob/1/3/3_7.f',\n", + " '/home/dave/test_tree/bob/1/3/3_9.f',\n", + " '/home/dave/test_tree/bob/1/3/3_8.f',\n", + " '/home/dave/test_tree/bob/1/3/3_5.f',\n", + " '/home/dave/test_tree/bob/1/3/3_6.f',\n", + " '/home/dave/test_tree/bob/1/3/3_4.f',\n", + " '/home/dave/test_tree/bob/1/3/3_2.f',\n", + " '/home/dave/test_tree/bob/1/3/3_3.f',\n", + " '/home/dave/test_tree/bob/1/3/3_10.f',\n", + " '/home/dave/test_tree/bob/1/3/3_1.f'],\n", + " ['/home/dave/test_tree/bob/1/7/7_10.f',\n", + " '/home/dave/test_tree/bob/1/7/7_7.f',\n", + " '/home/dave/test_tree/bob/1/7/7_6.f',\n", + " '/home/dave/test_tree/bob/1/7/7_8.f',\n", + " '/home/dave/test_tree/bob/1/7/7_9.f',\n", + " '/home/dave/test_tree/bob/1/7/7_3.f',\n", + " '/home/dave/test_tree/bob/1/7/7_1.f',\n", + " '/home/dave/test_tree/bob/1/7/7_4.f',\n", + " '/home/dave/test_tree/bob/1/7/7_2.f',\n", + " '/home/dave/test_tree/bob/1/7/7_5.f'],\n", + " ['/home/dave/test_tree/bob/1/5/5_9.f',\n", + " '/home/dave/test_tree/bob/1/5/5_10.f',\n", + " '/home/dave/test_tree/bob/1/5/5_8.f',\n", + " '/home/dave/test_tree/bob/1/5/5_1.f',\n", + " '/home/dave/test_tree/bob/1/5/5_5.f',\n", + " '/home/dave/test_tree/bob/1/5/5_2.f',\n", + " '/home/dave/test_tree/bob/1/5/5_6.f',\n", + " '/home/dave/test_tree/bob/1/5/5_3.f',\n", + " '/home/dave/test_tree/bob/1/5/5_4.f',\n", + " '/home/dave/test_tree/bob/1/5/5_7.f'],\n", + " ['/home/dave/test_tree/bob/1/2/2_6.f',\n", + " '/home/dave/test_tree/bob/1/2/2_1.f',\n", + " '/home/dave/test_tree/bob/1/2/2_9.f',\n", + " '/home/dave/test_tree/bob/1/2/2_2.f',\n", + " '/home/dave/test_tree/bob/1/2/2_10.f',\n", + " '/home/dave/test_tree/bob/1/2/2_5.f',\n", + " '/home/dave/test_tree/bob/1/2/2_4.f',\n", + " '/home/dave/test_tree/bob/1/2/2_3.f',\n", + " '/home/dave/test_tree/bob/1/2/2_7.f',\n", + " '/home/dave/test_tree/bob/1/2/2_8.f'],\n", + " ['/home/dave/test_tree/bob/1/10/10_10.f',\n", + " '/home/dave/test_tree/bob/1/10/10_8.f',\n", + " '/home/dave/test_tree/bob/1/10/10_3.f',\n", + " '/home/dave/test_tree/bob/1/10/10_4.f',\n", + " '/home/dave/test_tree/bob/1/10/10_1.f',\n", + " '/home/dave/test_tree/bob/1/10/10_9.f',\n", + " '/home/dave/test_tree/bob/1/10/10_6.f',\n", + " '/home/dave/test_tree/bob/1/10/10_7.f',\n", + " '/home/dave/test_tree/bob/1/10/10_5.f',\n", + " '/home/dave/test_tree/bob/1/10/10_2.f'],\n", + " ['/home/dave/test_tree/bob/1/8/8_2.f',\n", + " '/home/dave/test_tree/bob/1/8/8_8.f',\n", + " '/home/dave/test_tree/bob/1/8/8_9.f',\n", + " '/home/dave/test_tree/bob/1/8/8_7.f',\n", + " '/home/dave/test_tree/bob/1/8/8_4.f',\n", + " '/home/dave/test_tree/bob/1/8/8_1.f',\n", + " '/home/dave/test_tree/bob/1/8/8_3.f',\n", + " '/home/dave/test_tree/bob/1/8/8_10.f',\n", + " '/home/dave/test_tree/bob/1/8/8_6.f',\n", + " '/home/dave/test_tree/bob/1/8/8_5.f'],\n", + " ['/home/dave/test_tree/bob/1/4/4_5.f',\n", + " '/home/dave/test_tree/bob/1/4/4_7.f',\n", + " '/home/dave/test_tree/bob/1/4/4_4.f',\n", + " '/home/dave/test_tree/bob/1/4/4_6.f',\n", + " '/home/dave/test_tree/bob/1/4/4_8.f',\n", + " '/home/dave/test_tree/bob/1/4/4_3.f',\n", + " '/home/dave/test_tree/bob/1/4/4_9.f',\n", + " '/home/dave/test_tree/bob/1/4/4_2.f',\n", + " '/home/dave/test_tree/bob/1/4/4_10.f',\n", + " '/home/dave/test_tree/bob/1/4/4_1.f'],\n", + " ['/home/dave/test_tree/bob/1/9/9_4.f',\n", + " '/home/dave/test_tree/bob/1/9/9_5.f',\n", + " '/home/dave/test_tree/bob/1/9/9_8.f',\n", + " '/home/dave/test_tree/bob/1/9/9_7.f',\n", + " '/home/dave/test_tree/bob/1/9/9_6.f',\n", + " '/home/dave/test_tree/bob/1/9/9_1.f',\n", + " '/home/dave/test_tree/bob/1/9/9_10.f',\n", + " '/home/dave/test_tree/bob/1/9/9_2.f',\n", + " '/home/dave/test_tree/bob/1/9/9_3.f',\n", + " '/home/dave/test_tree/bob/1/9/9_9.f'],\n", + " ['/home/dave/test_tree/bob/1/6/6_6.f',\n", + " '/home/dave/test_tree/bob/1/6/6_4.f',\n", + " '/home/dave/test_tree/bob/1/6/6_3.f',\n", + " '/home/dave/test_tree/bob/1/6/6_5.f',\n", + " '/home/dave/test_tree/bob/1/6/6_8.f',\n", + " '/home/dave/test_tree/bob/1/6/6_1.f',\n", + " '/home/dave/test_tree/bob/1/6/6_10.f',\n", + " '/home/dave/test_tree/bob/1/6/6_9.f',\n", + " '/home/dave/test_tree/bob/1/6/6_7.f',\n", + " '/home/dave/test_tree/bob/1/6/6_2.f'],\n", + " ['/home/dave/test_tree/bob/1/1/1_6.f',\n", + " '/home/dave/test_tree/bob/1/1/1_9.f',\n", + " '/home/dave/test_tree/bob/1/1/1_10.f',\n", + " '/home/dave/test_tree/bob/1/1/1_1.f',\n", + " '/home/dave/test_tree/bob/1/1/1_3.f',\n", + " '/home/dave/test_tree/bob/1/1/1_7.f',\n", + " '/home/dave/test_tree/bob/1/1/1_5.f',\n", + " '/home/dave/test_tree/bob/1/1/1_2.f',\n", + " '/home/dave/test_tree/bob/1/1/1_4.f',\n", + " '/home/dave/test_tree/bob/1/1/1_8.f']],\n", + " 'zips': [{'zip_data': None, 'id': None, 'zip_object_name': ''}],\n", + " 'parent_parent_folder': '/home/dave/test_tree/bob',\n", + " 'size': 10485760}}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dicts[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "lsst-uk", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/csd3-side/scripts/lsst-backup.py b/csd3-side/scripts/lsst-backup.py index 03e2c0b..7d9b3aa 100644 --- a/csd3-side/scripts/lsst-backup.py +++ b/csd3-side/scripts/lsst-backup.py @@ -28,7 +28,7 @@ import io import zipfile import warnings -from psutil import virtual_memory +from psutil import virtual_memory as mem warnings.filterwarnings('ignore') from logging import ERROR @@ -38,7 +38,7 @@ import os import argparse -from dask.distributed import Client, get_client, wait, as_completed, Future +from dask.distributed import Client, get_client, wait, as_completed, Future, fire_and_forget import subprocess from typing import List @@ -96,21 +96,47 @@ def find_metadata(key: str, bucket) -> List[str]: else: return None +def mem_check(futures): + """ + Checks the memory usage of the Dask workers. + + Args: + futures (list): A list of Dask futures. + + Returns: + None + """ + client = get_client() + workers = client.scheduler_info()['workers'] + system_perc = mem().percent + print(f'System memory usage: {system_perc:.0f}%.') + min_w_mem = None + high_mem_workers = [] + for w in workers.items(): + if min_w_mem is None or min_w_mem > w[1]['memory_limit']: + min_w_mem = w[1]['memory_limit'] + used = w[1]['metrics']['managed_bytes'] + w[1]['metrics']['spilled_bytes']['memory'] + used_perc = used / w[1]['memory_limit'] * 100 + if used_perc > 80: + high_mem_workers.append(w[1]['id']) + if high_mem_workers: + print(f'High memory usage on workers: {high_mem_workers}.') + wait(futures) + def remove_duplicates(l: list[dict]) -> list[dict]: return pd.DataFrame(l).drop_duplicates().to_dict(orient='records') -def zip_and_upload(s3_host, access_key, secret_key, bucket_name, destination_dir, local_dir, parent_folder, subfolders_to_collate, folders_files, total_size_uploaded, total_files_uploaded, use_compression, dryrun, id, mem_per_worker, perform_checksum) -> tuple[str, int, bytes]: +def zip_and_upload(s3_host, access_key, secret_key, bucket_name, destination_dir, local_dir, file_paths, total_size_uploaded, total_files_uploaded, use_compression, dryrun, id, mem_per_worker, perform_checksum) -> tuple[str, int, bytes]: + # print('in zip_and_upload', flush=True) ############# # zip part # ############# client = get_client() - print(f'Collating {len(subfolders_to_collate)} subfolders into a zip file.', flush=True) # with annotate(parent_folder=parent_folder): zip_data, namelist = client.submit(zip_folders, - parent_folder, - subfolders_to_collate, - folders_files, + local_dir, + file_paths, use_compression, dryrun, id, @@ -122,12 +148,14 @@ def zip_and_upload(s3_host, access_key, secret_key, bucket_name, destination_dir ############### # upload part # ############### - zip_object_key = os.sep.join([destination_dir, os.path.relpath(f'{parent_folder}/collated_{id}.zip', local_dir)]) + # zips now placed at top level of backup == local_dir + zip_object_key = os.sep.join([destination_dir, os.path.relpath(f'{local_dir}/collated_{id}.zip', local_dir)]) + print(f'zip_object_key: {zip_object_key}', flush=True) if namelist == []: - print(f'No files to upload in zip file containing {len(subfolders_to_collate)} subfolders.') + print(f'No files to upload in zip file.') return zip_object_key+' nothing to upload' else: - print(f'Uploading zip file containing {len(subfolders_to_collate)} subfolders to S3 bucket {bucket_name} to key {zip_object_key}.', flush=True) + print(f'Uploading zip file containing {len(file_paths)} files to S3 bucket {bucket_name} to key {zip_object_key}.', flush=True) # with annotate(parent_folder=parent_folder): f = client.submit(upload_and_callback, s3_host, @@ -135,7 +163,7 @@ def zip_and_upload(s3_host, access_key, secret_key, bucket_name, destination_dir secret_key, bucket_name, local_dir, - parent_folder, + destination_dir, zip_data, namelist, zip_object_key, @@ -150,16 +178,14 @@ def zip_and_upload(s3_host, access_key, secret_key, bucket_name, destination_dir mem_per_worker ) # del zip_data, namelist - return f + return f, zip_object_key -def zip_folders(parent_folder:str, subfolders_to_collate:list[str], folders_files:list[str], use_compression:bool, dryrun:bool, id:int, mem_per_worker:int) -> tuple[str, int, bytes]: +def zip_folders(local_dir:str, file_paths:list[str], use_compression:bool, dryrun:bool, id:int, mem_per_worker:int) -> tuple[str, int, bytes]: """ Collates the specified folders into a zip file. Args: - parent_folder (str): The path of the parent folder. - subfolders_to_collate (list): A list of subfolder paths to be included in the zip file. - folders_files (list): A list of lists containing files to be included in the zip file for each subfolder. + file_paths (list): A list of lists containing files to be included in the zip file for each subfolder. use_compression (bool): Flag indicating whether to use compression for the zip file. dryrun (bool): Flag indicating whether to perform a dry run without actually creating the zip file. id (int, optional): An optional identifier for the zip file. Defaults to 0. @@ -171,22 +197,10 @@ def zip_folders(parent_folder:str, subfolders_to_collate:list[str], folders_file Raises: None - Examples: - # Example usage - parent_folder = "/path/to/parent/folder" - subfolders_to_collate = ["/path/to/subfolder1", "/path/to/subfolder2"] - folders_files = [["file1.txt", "file2.txt"], ["file3.txt", "file4.txt"]] - use_compression = True - dryrun = False - id = 1 - - result = zip_folders(parent_folder, subfolders_to_collate, folders_files, use_compression, dryrun, id) - print(result) - # Output: ("/path/to/parent/folder", 1, b'compressed_zip_file_data') - """ + # print(file_paths, flush=True) zipped_size = 0 - client = get_client() + # client = get_client() if not dryrun: try: zip_buffer = io.BytesIO() @@ -195,12 +209,14 @@ def zip_folders(parent_folder:str, subfolders_to_collate:list[str], folders_file else: compression = zipfile.ZIP_STORED # zipfile.ZIP_STORED = no compression with zipfile.ZipFile(zip_buffer, "a", compression, True) as zip_file: - for file in folders_files: + for file in file_paths: + # print(file, flush=True) if file.startswith('/'): file_path = file else: - file_path = os.path.join(subfolders_to_collate, file) - arc_name = os.path.relpath(file_path, parent_folder) + exit('Path is wrong') + arc_name = os.path.relpath(file_path, local_dir) + # print(f'arc_name {arc_name}', flush=True) try: zipped_size += os.path.getsize(file_path) with open(file_path, 'rb') as src_file: @@ -212,7 +228,7 @@ def zip_folders(parent_folder:str, subfolders_to_collate:list[str], folders_file if zipped_size > mem_per_worker: print(f'WARNING: Zipped size of {zipped_size} bytes exceeds memory per core of {mem_per_worker} bytes.') except MemoryError as e: - print(f'Error zipping {parent_folder}: {e}') + print(f'Error zipping: {e}') print(f'Namespace: {globals()}') exit(1) if namelist == []: @@ -646,6 +662,7 @@ def upload_and_callback(s3_host, access_key, secret_key, bucket_name, local_dir, return None +### KEY FUNCTION TO FIND ALL FILES AND ORGANISE UPLOADS ### def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, exclude, local_dir, destination_dir, perform_checksum, dryrun, log, global_collate, use_compression, client, mem_per_worker) -> None: """ Uploads files from a local directory to an S3 bucket in parallel. @@ -680,7 +697,7 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, exit(1) #recursive loop over local folder - to_collate = {} # store folders to collate + to_collate = [] total_all_folders = 0 total_all_files = 0 folder_num = 0 @@ -690,6 +707,10 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, upload_futures = [] zul_futures = [] failed = [] + max_zip_batch_size = 128*1024**2 + zip_batch_files = [[]] + zip_batch_object_names = [[]] + zip_batch_sizes = [0] print(f'Analysing local dataset {local_dir}.') for folder, sub_folders, files in os.walk(local_dir, topdown=True): total_all_folders += 1 @@ -698,7 +719,7 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, print() print(f'Preparing to upload {total_all_files} files in {total_all_folders} folders from {local_dir} to {bucket_name}/{destination_dir}.', flush=True) - for folder, sub_folders, files in os.walk(local_dir, topdown=True): + for folder, sub_folders, files in os.walk(local_dir, topdown=False): folder_num += 1 file_num += len(files) print(f'Processing {folder_num}/{total_all_folders} folders; {file_num}/{total_all_files} files in {local_dir}.') @@ -788,7 +809,7 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, print(f'Skipping subfolder - all files exist.') continue - if mean_filesize > 256*1024**2 or not global_collate: + if mean_filesize > max_zip_batch_size or not global_collate: print('Individual upload.') # all files within folder # if uploading file individually, remove existing files from object_names @@ -810,12 +831,11 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, object_names[i] = '.'.join([object_names[i], 'symlink']) #add symlink target to symlink_targets list #using target dir as-is can cause permissions issues - #reaplce /home path with /rds path uses as local_dir + #replace /home path with /rds path uses as local_dir target = to_rds_path(os.path.realpath(folder_files[i]), local_dir) symlink_targets.append(target) #add real file to symlink_obj_names list symlink_obj_names.append(symlink_obj_name) - # append symlink_targets and symlink_obj_names to folder_files and object_names folder_files.extend(symlink_targets) object_names.extend(symlink_obj_names) @@ -827,6 +847,7 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, print(f'{file_count - pre_linkcheck_file_count} symlinks replaced with files. Symlinks renamed to .symlink') print(f'Sending {file_count} files (total size: {folder_files_size/1024**2:.0f} MiB) in {folder} to S3 bucket {bucket_name}.') + print(f'Individual files objects names: {object_names}', flush=True) try: for i,args in enumerate(zip( @@ -871,18 +892,17 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, elif len(folder_files) > 0 and global_collate: # small files in folder print('Collated upload.') - folder_files_size = np.sum(np.array([os.lstat(filename).st_size for filename in folder_files])) - parent_folder = os.path.abspath(os.path.join(folder, os.pardir)) - print(f'parent_folder: {parent_folder}') - # possibly pass if parent_folder == local_dir or parent_folder contains '..' - if parent_folder not in to_collate.keys(): - #initialise parent folder - to_collate[parent_folder] = {'parent_folder':parent_folder,'folders':[],'object_names':[], 'folder_files':[], 'zips':[{'zip_data':None, 'id':None, 'zip_object_name':''}]} # store folders to collate + # Existing object removal + if not current_objects.empty: + for oni, on in enumerate(object_names): + if current_objects['CURRENT_OBJECTS'].isin([on]).any() or current_objects['CURRENT_OBJECTS'].isin([f'{on}.symlink']).any(): + object_names.remove(on) + del folder_files[oni] pre_linkcheck_file_count = len(object_names) if init_len - pre_linkcheck_file_count > 0: print(f'Skipping {init_len - pre_linkcheck_file_count} existing files.') - #always do this AFTER removing "current_objects" to avoid re-uploading + symlink_targets = [] symlink_obj_names = [] for i in range(len(folder_files)): @@ -897,171 +917,238 @@ def process_files(s3_host, access_key, secret_key, bucket_name, current_objects, symlink_targets.append(target) #add real file to symlink_obj_names list symlink_obj_names.append(symlink_obj_name) - + # append symlink_targets and symlink_obj_names to folder_files and object_names - folder_files.extend(symlink_targets) object_names.extend(symlink_obj_names) file_count = len(object_names) + #always do this AFTER removing "current_objects" to avoid re-uploading + + # Level n collation + size = zip_batch_sizes[-1] + print(f'Size: {size}') + for i, filename in enumerate(folder_files): + s = os.lstat(filename).st_size + size += s + if size <= max_zip_batch_size: + zip_batch_files[-1].append(filename) + zip_batch_object_names[-1].append(object_names[i]) + zip_batch_sizes[-1] += size + else: + zip_batch_files.append([filename]) + zip_batch_object_names.append([object_names[i]]) + zip_batch_sizes.append(s) + size = s + # print(f'Folder: {folder}') + # print(f'Level: {folder.replace(local_dir, "").count(os.sep)}') # level of folder in local_dir + # print(f'local_dir: {local_dir}') + # print(f'zip_batches: {zip_batch_files}') + # print(f'zip_batch_sizes: {zip_batch_sizes}') + # print(f'zip batch object names: {zip_batch_object_names}') + # print(f'lens: {len(zip_batch_files)} {len(zip_batch_sizes)}') + # print(f'file batch lens: {[len(x) for x in zip_batch_files]} ') - ############################### - # CHECK HERE FOR ZIP CONTENTS # - ############################### - these_zip_contents = [ff.replace(parent_folder+'/','') for ff in folder_files] + # Level n-1 collation + # This is very tricky, but would be a nice addition + # i = 1 + # if len(zip_batch_sizes) > 1: + # while True: + # print(i) + # if zip_batch_sizes[-i] + zip_batch_sizes[-(i+1)] < max_zip_batch_size: + # zip_batch_sizes[-(i+1)] += zip_batch_sizes.pop(-i) + # zip_batches[-(i+1)].extend(zip_batches.pop(-i)) + # else: + # if i == len(zip_batch_sizes) - 1: + # break + # i+=1 + # print(f'Folder: {folder}') + # print(f'Level: {folder.replace(local_dir, "").count(os.sep)}') # level of folder in local_dir + # print(f'local_dir: {local_dir}') + # print(f'zip_batches: {zip_batches}') + # print(f'zip_batch_sizes: {zip_batch_sizes}') + # print(f'lens: {len(zip_batches)} {len(zip_batch_sizes)}') + + folder_files_size = np.sum(np.array([os.lstat(filename).st_size for filename in folder_files])) + # parent_folder = os.path.abspath(os.path.join(folder, os.pardir)) + # print(f'parent_folder: {parent_folder}') + print(f'Number of zip files: {len(zip_batch_files)}') + # possibly pass if parent_folder == local_dir or parent_folder contains '..' + print('', flush=True) + # mem_check() + + if global_collate: + ############################### + # CHECK HERE FOR ZIP CONTENTS # + ############################### + # Re-write for bottom-up approach + for i, zip_batch in enumerate(zip_batch_object_names): + cmp = [x.replace(destination_dir+'/', '') for x in zip_batch] if not current_objects.empty: - if current_objects['METADATA'].isin([these_zip_contents]).any(): - existing_zip_contents = current_objects[current_objects['METADATA'].isin([these_zip_contents])]['METADATA'].values[0] - if all([x in existing_zip_contents for x in these_zip_contents]): - print(f'Zip file {to_collate[parent_folder]["zips"][-1]["zip_object_name"]} already exists and file lists match - skipping.') - del to_collate[parent_folder] + if current_objects['METADATA'].isin([cmp]).any(): + existing_zip_contents = current_objects[current_objects['METADATA'].isin([cmp])]['METADATA'].values[0] + if all([x in existing_zip_contents for x in cmp]): + print(f'Zip file {destination_dir}/collated_{i+1}.zip already exists and file lists match - skipping.') + zip_batch_object_names.pop(i) + zip_batch_files.pop(i) continue else: - print(f'Zip file {to_collate[parent_folder]["zips"][-1]["zip_object_name"]} already exists but file lists do not match - reuploading.') - - to_collate[parent_folder]['folders'].append(folder) - to_collate[parent_folder]['object_names'].append(object_names) - to_collate[parent_folder]['folder_files'].append(folder_files) - - #Does this just slow it down? - # sched_info = client.scheduler_info() - # max_mem = 0 - # mem_lim = None - # for _, winfo in sched_info['workers'].items(): - # if not mem_lim: - # mem_lim = winfo['memory_limit'] - # mem = winfo['metrics']['memory'] - # if mem > max_mem: - # max_mem = mem - # if max_mem / mem_lim > 0.9: - # wait(upload_futures) - print('', flush=True) - - + print(f'Zip file {destination_dir}/collated_{i+1}.zip already exists but file lists do not match - reuploading.') + + # Create list of dicts for zip files + for i, file_paths in enumerate(zip_batch_files): + to_collate.append( + {'object_names':zip_batch_object_names[i], + 'file_paths':file_paths, + 'zips':[{'zip_data':None, 'id':None, 'zip_object_name':''}], + 'size':zip_batch_sizes[i]}) # store folders to collate + del zip_batch_files, zip_batch_object_names, zip_batch_sizes + client.scatter(to_collate, broadcast=True) + # print(f'TO_COLLATE: {to_collate}') + # print(f'ZIP_BATCH_FILES: {zip_batch_files}') + # parents = [] + # for zbf in zip_batch_files: + # for f in zbf: + # parents.append(os.path.abspath(os.sep.join([f,os.path.pardir])).replace(local_dir,'')) + # print(set(sorted(parents))) + # exit() # collate folders - if len(to_collate) > 0: - print(f'Collating {len([to_collate[parent_folder]["folders"] for parent_folder in to_collate.keys()])} folders into zip files.') #{sum([len(x["zips"]) for x in to_collate.keys()])} + if len(to_collate) > 0: + # print(f'Collating {len([to_collate[parent_folder]["folders"] for parent_folder in to_collate.keys()])} folders into zip files.', flush=True) #{sum([len(x["zips"]) for x in to_collate.keys()])} + # print('TO_COLLATE:') + # for tc in to_collate: + # print(tc['file_paths']) + # print(len(to_collate)) + # call zip_folder in parallel + print(f'Zipping {len(to_collate)} batches.', flush=True) + # for i, zip_batch_dict in enumerate(to_collate): + + ######################## + ## rewrite expanding list comprehension + ######################### - # call zip_folder in parallel - for zip_tuple in to_collate.items(): - parent_folder = zip_tuple[0] - if os.path.abspath(parent_folder) == os.path.abspath(os.sep.join([local_dir,'..'])): - continue - folders = zip_tuple[1]['folders'] - folder_files = zip_tuple[1]['folder_files'] - num_files = sum([len(ff) for ff in folder_files]) - - ######################## - ## rewrite expanding list comprehension - ######################### - - max_filesize = 0 - for ff in folder_files: - for filename in ff: - try: - fs = os.lstat(filename).st_size - except PermissionError: - print(f'WARNING: Permission error reading {filename}. File will not be backed up.') - try: - folder_files.remove(filename) - except ValueError: - pass - if len(folder_files) == 0: - print(f'Skipping subfolder - no files - see permissions warning(s).') - continue - - if fs > max_filesize: - max_filesize = fs - # except ValueError: - # # no files in folder - likely removed from file list due to previous PermissionError - continue without message - # continue - - max_files_per_zip = int(np.ceil(1024**3 / max_filesize)) # limit zips to 1 GiB - using available memory too inconsistent - num_zips = int(np.ceil(num_files / max_files_per_zip)) - - chunk_subfolders = False - if num_zips > len(folders): - chunk_subfolders = True - - if chunk_subfolders: - subchunks_files = [] - subchunks = [] - for j in range(len(folders)): - step = len(folder_files[j])//num_zips - if step == 0: - step = 1 - for i in range(0, len(folder_files[j]), step): - subchunks_files.append(folder_files[j][i:i+step]) - subchunks.append(folders[j]) - chunks = subchunks - chunk_files = subchunks_files - else: - chunks = folders - chunk_files = folder_files - - if len(chunks) != len(chunk_files): - print('Error: chunks and chunk_files are not the same length.') - sys.exit(1) - #def zip_and_upload( total_size_uploaded, total_files_uploaded, use_compression, dryrun, id, mem_per_worker, perform_checksum) -> tuple[str, int, bytes]: - for i, args in enumerate(zip( - repeat(s3_host), - repeat(access_key), - repeat(secret_key), - repeat(bucket_name), - repeat(destination_dir), - repeat(local_dir), - repeat(parent_folder), - chunks, - chunk_files, - repeat(total_size_uploaded), - repeat(total_files_uploaded), - repeat(use_compression), - repeat(dryrun), - [i for i in range(len(chunks))], - repeat(mem_per_worker), - repeat(perform_checksum), - )): - # with annotate(parent_folder=parent_folder): - zul_futures.append(client.submit( - zip_and_upload, - *args - )) - # DOes this just slow it down? - # sched_info = client.scheduler_info() - # max_mem = 0 - # mem_lim = None - # for _, winfo in sched_info['workers'].items(): - # if not mem_lim: - # mem_lim = winfo['memory_limit'] - # mem = winfo['metrics']['memory'] - # if mem > max_mem: - # max_mem = mem - # if max_mem / mem_lim > 0.9: - # wait(upload_futures) + # max_filesize = 0 + # # for ff in folder_files: + # for filename in ff: + # try: + # fs = os.lstat(filename).st_size + # except PermissionError: + # print(f'WARNING: Permission error reading {filename}. File will not be backed up.') + # try: + # folder_files.remove(filename) + # except ValueError: + # pass + # if len(folder_files) == 0: + # print(f'Skipping subfolder - no files - see permissions warning(s).') + # continue + + # if fs > max_filesize: + # max_filesize = fs + # # except ValueError: + # # # no files in folder - likely removed from file list due to previous PermissionError - continue without message + # # continue + + # max_files_per_zip = int(np.ceil(1024**3 / max_filesize)) # limit zips to 1 GiB - using available memory too inconsistent + # num_zips = int(np.ceil(num_files / max_files_per_zip)) + + # chunk_subfolders = False + # if num_zips > len(folders): + # chunk_subfolders = True + + # if chunk_subfolders: + # subchunks_files = [] + # subchunks = [] + # for j in range(len(folders)): + # step = len(folder_files[j])//num_zips + # if step == 0: + # step = 1 + # for i in range(0, len(folder_files[j]), step): + # subchunks_files.append(folder_files[j][i:i+step]) + # subchunks.append(folders[j]) + # chunks = subchunks + # chunk_files = subchunks_files + # else: + # chunks = folders + # chunk_files = folder_files + + # if len(chunks) != len(chunk_files): + # print('Error: chunks and chunk_files are not the same length.') + # sys.exit(1) + + # for i, args in enumerate(zip( + # repeat(s3_host), + # repeat(access_key), + # repeat(secret_key), + # repeat(bucket_name), + # repeat(destination_dir), + # repeat(local_dir), + # zip_batch_dict['file_paths'], + # repeat(total_size_uploaded), + # repeat(total_files_uploaded), + # repeat(use_compression), + # repeat(dryrun), + # [i for i in range(len(zip_batch_dict['file_paths']))], + # repeat(mem_per_worker), + # repeat(perform_checksum), + # )): + # # with annotate(parent_folder=parent_folder): + for i, d in enumerate(to_collate): + zul_futures.append(client.submit( + zip_and_upload, + s3_host, + access_key, + secret_key, + bucket_name, + destination_dir, + local_dir, + d['file_paths'], + total_size_uploaded, + total_files_uploaded, + use_compression, + dryrun, + i, + mem_per_worker, + perform_checksum, + # workers='01234' + )) + mem_check(zul_futures) + # print(f'Submit {i} {d}') ######################## # Monitor upload tasks # ######################## # while len(upload_futures) +len(zul_futures) > 0: - monitor_start = datetime.now() - for f in as_completed(upload_futures+zul_futures): - if datetime.now() - monitor_start > timedelta(seconds=5): - print(f'Current queue: {len(upload_futures)} file upload; {len(zul_futures)} zip and upload', end='\r') - monitor_start = datetime.now() - - + print('Monitoring zip tasks.', flush=True) + for f in as_completed(zul_futures): + result = f.result() + upload_futures.append(result[0]) + print(f'Zip {result[1]} created and added to upload queue.', flush=True) + + # fire_and_forget(upload_futures) + for f in as_completed(upload_futures): if 'exception' in f.status and f not in failed: f_tuple = f.exception(), f.traceback() del f if f_tuple not in failed: failed.append(f_tuple) elif 'finished' in f.status: - if f in zul_futures: - if isinstance(f.result(), Future): - zul_futures.append(f.result()) - del f - else: - del f + del f + # mem_check() + # monitor_start = datetime.now() + # print('Monitoring upload tasks.', flush=True) + # for f in as_completed(upload_futures): + # if datetime.now() - monitor_start > timedelta(seconds=5): + # print(f'Current queues: {len(upload_futures)} file upload(s); {len(zul_futures)} zip upload(s)', end='\r') + # monitor_start = datetime.now() + + + # if 'exception' in f.status and f not in failed: + # f_tuple = f.exception(), f.traceback() + # del f + # if f_tuple not in failed: + # failed.append(f_tuple) + # elif 'finished' in f.status: + # del f if failed: for i, failed_upload in enumerate(failed): @@ -1081,6 +1168,7 @@ def error(self, message): formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument('--config-file', type=str, help='Path to the configuration YAML file.') + parser.add_argument('--collate-list-file', type=str, help='Path to the list of files and folders to collate. Previous output of --save-collate-list. NOT YET IMPLEMENTED') parser.add_argument('--bucket-name', type=str, help='Name of the S3 bucket.') parser.add_argument('--local-path', type=str, help='Absolute path to the folder to be uploaded.') parser.add_argument('--S3-prefix', type=str, help='Prefix to be used in S3 object keys.') @@ -1093,6 +1181,7 @@ def error(self, message): parser.add_argument('--no-checksum', default=False, action='store_true', help='Do not perform checksum validation during upload.') parser.add_argument('--no-compression', default=False, action='store_true', help='Do not use compression when collating files.') parser.add_argument('--save-config', default=False, action='store_true', help='Save the configuration to the provided config file path and exit.') + parser.add_argument('--save-collate-list', default=False, action='store_true', help='Save the list of files and folders to collate. Use to skip folder scanning. NOT YET IMPLEMENTED') args = parser.parse_args() if not args.config_file and not (args.bucket_name and args.local_path and args.S3_prefix): @@ -1221,7 +1310,7 @@ def error(self, message): try: keys = bm.get_keys() except KeyError as e: - print(e) + print(f'KeyError {e}', file=sys.stderr) sys.exit() access_key = keys['access_key'] secret_key = keys['secret_key'] @@ -1242,56 +1331,67 @@ def error(self, message): print('dryrun == True, so continuing.') bucket = s3.Bucket(bucket_name) - print(f'Getting current object list for {bucket_name}. This may take some time.\nStarting at {datetime.now()}, elapsed time = {datetime.now() - start}', flush=True) - current_objects = bm.object_list(bucket, count=True, prefix=destination_dir) - print() - print(f'Done.\nFinished at {datetime.now()}, elapsed time = {datetime.now() - start}', flush=True) - - current_objects = pd.DataFrame.from_dict({'CURRENT_OBJECTS':current_objects}) - - print(f'Current objects (with matching prefix): {len(current_objects)}', flush=True) - if not current_objects.empty: - print('Obtaining current object metadata.') - current_objects['METADATA'] = current_objects['CURRENT_OBJECTS'].apply(find_metadata, bucket=bucket) + success = False + while not success: + print(f'Getting current object list for {bucket_name}. This may take some time.\nStarting at {datetime.now()}, elapsed time = {datetime.now() - start}', flush=True) + current_objects = bm.object_list(bucket, prefix=destination_dir, count=True) print() - else: - current_objects['METADATA'] = None + print(f'Done.\nFinished at {datetime.now()}, elapsed time = {datetime.now() - start}', flush=True) + + current_objects = pd.DataFrame.from_dict({'CURRENT_OBJECTS':current_objects}) + + print(f'Current objects (with matching prefix): {len(current_objects)}', flush=True) + if not current_objects.empty: + print('Obtaining current object metadata.') + current_objects['METADATA'] = current_objects['CURRENT_OBJECTS'].apply(find_metadata, bucket=bucket) + print() + else: + current_objects['METADATA'] = None - # current_objects.to_csv('current_objects.csv', index=False) - # exit() - - ## check if log exists in the bucket, and download it and append top it if it does - # TODO: integrate this with local check for log file - if current_objects['CURRENT_OBJECTS'].isin([log]).any(): - print(f'Log file {log} already exists in bucket. Downloading.') - bucket.download_file(log, log) - elif current_objects['CURRENT_OBJECTS'].isin([previous_log]).any(): - print(f'Previous log file {previous_log} already exists in bucket. Downloading.') - bucket.download_file(previous_log, log) - - # check local_dir formatting - while local_dir[-1] == '/': - local_dir = local_dir[:-1] - - ############################ - # Dask Setup # - ############################ - total_memory = virtual_memory().total - n_workers = nprocs//threads_per_worker - mem_per_worker = virtual_memory().total//n_workers # e.g., 187 GiB / 48 * 2 = 7.8 GiB - print(f'nprocs: {nprocs}, Threads per worker: {threads_per_worker}, Number of workers: {n_workers}, Total memory: {total_memory/1024**3:.2f} GiB, Memory per worker: {mem_per_worker/1024**3:.2f} GiB') - # client = Client(n_workers=n_workers,threads_per_worker=threads_per_worker,memory_limit=mem_per_worker) #,silence_logs=ERROR - # Process the files - with Client(n_workers=n_workers,threads_per_worker=threads_per_worker,memory_limit=mem_per_worker) as client: - print(f'Dask Client: {client}', flush=True) - print(f'Starting processing at {datetime.now()}, elapsed time = {datetime.now() - start}') - print(f'Using {nprocs} processes.') - with warnings.catch_warnings(): - warnings.filterwarnings('ignore') - process_files(s3_host,access_key, secret_key, bucket_name, current_objects, exclude, local_dir, destination_dir, perform_checksum, dryrun, log, global_collate, use_compression, client, mem_per_worker) + # current_objects.to_csv('current_objects.csv', index=False) + # exit() + + ## check if log exists in the bucket, and download it and append top it if it does + # TODO: integrate this with local check for log file + if current_objects['CURRENT_OBJECTS'].isin([log]).any(): + print(f'Log file {log} already exists in bucket. Downloading.') + bucket.download_file(log, log) + elif current_objects['CURRENT_OBJECTS'].isin([previous_log]).any(): + print(f'Previous log file {previous_log} already exists in bucket. Downloading.') + bucket.download_file(previous_log, log) + + # check local_dir formatting + while local_dir[-1] == '/': + local_dir = local_dir[:-1] + + ############################ + # Dask Setup # + ############################ + total_memory = mem().total + n_workers = nprocs//threads_per_worker + mem_per_worker = mem().total//n_workers # e.g., 187 GiB / 48 * 2 = 7.8 GiB + print(f'nprocs: {nprocs}, Threads per worker: {threads_per_worker}, Number of workers: {n_workers}, Total memory: {total_memory/1024**3:.2f} GiB, Memory per worker: {mem_per_worker/1024**3:.2f} GiB') + # client = Client(n_workers=n_workers,threads_per_worker=threads_per_worker,memory_limit=mem_per_worker) #,silence_logs=ERROR + # Process the files + try: + with Client(n_workers=n_workers,threads_per_worker=threads_per_worker,memory_limit=mem_per_worker) as client: + print(f'Dask Client: {client}', flush=True) + print(f'Dashboard: {client.dashboard_link}', flush=True) + print(f'Starting processing at {datetime.now()}, elapsed time = {datetime.now() - start}') + print(f'Using {nprocs} processes.') + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + process_files(s3_host,access_key, secret_key, bucket_name, current_objects, exclude, local_dir, destination_dir, perform_checksum, dryrun, log, global_collate, use_compression, client, mem_per_worker) + success = True + except Exception as e: + print(f'Restartings Dask client due to error: {e}') + print(f'Current objects will be repopulated.') + continue + print(f'Finished uploads at {datetime.now()}, elapsed time = {datetime.now() - start}') print(f'Dask Client closed at {datetime.now()}, elapsed time = {datetime.now() - start}') + print('Completing logging.') # Complete final_time = datetime.now() - start