Структура данных для поддержки пары файлов - PullRequest
0 голосов
/ 26 июня 2018

Фон

Существует два файла с именем alertfile & eventfile.

Эта пара файлов находится в нескольких папках (показано ниже), причем каждая пара файлов имеет различное содержимое.

Единственный способ распознать имена файловых пар, отличных от другой пары, - это папка.структура, в которой они находятся.

Файлы всегда будут открываться в режиме только для чтения с использованием api файла python в Linux.

Что касается содержимого, одна файловая пара не имеет отношения к другой паре файлов,

Нет сведений о глубине структуры папок.

Имена папок неизвестны (заранее).

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

Размер каждой пары файлов имеет размер в килобайтах и ​​является статическим файлом.

root_folder
 |
 |
 +---folder1
 |       | 
 |       |___ alertfile
 |       |___ eventfile
 |
 +---folder2
 |       |
 |       |___ alertfile
 |       |___ eventfile
 |       |
 |       +--- folder_2_1
 |            |
 |            |___alertfile
 |            |___eventfile
 |            |
 |            +---folder_2_1_1
 |                |
 |                |___alertfile
 |                |___eventfile
 |          
 |      
 +---folder3
 |       |
 |       |___ alertfile
 |       |___ eventfile
 |
 +---folder4
 |       |
 |       +---folder4_1
 |             |
 |             |____ alertfile
 |             |____ eventfile
 |             |
 |             +---folder4_1_1(empty) 
 :
 :
 :

Цель

Существуетнеобходимость доступа к содержимому всех этих файловых пар в разных областях кода для разных целей.


Программа - это серверная программа ... которая поддерживает кэш этого набора пар файлов ...

1) Какую структуру данных я должен использовать для эффективного доступа к этим парам файлов?фактически анализировать содержимое в этих файловых парах .... по нескольким причинам

2) Быстрее ли иметь содержимое каждой пары файлов в паре структур данных?и ключ с путем к папке ..

3) Может ли чтение файла быть многопоточным перед созданием кэша?Поскольку python GIL позволяет чередующимся IO потокам чередоваться ..

1 Ответ

0 голосов
/ 26 июня 2018

Я рекомендую использовать вложенные дикты для кэширования ваших пар alertfile и eventfile.Поскольку папка может содержать или не содержать пары файлов, в этом случае она должна использовать клавишу '.' для хранения указания файловых пар в этой папке, например:

cache = {
    '.': {'alertfile': 'alert content', 'eventfile': 'event content'},
    'hello': {
        'foo': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}},
        'bar': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}}
    },
    'world': {
        'aloha': {
            '.': {'alertfile': 'alert content', 'eventfile': 'event content'},
            'hi': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}},
            'hey': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}}
        }
    },
    'empty': {}
}

И здесьявляется рекурсивной функцией, которая сканирует заданный каталог, читает любую из пар файлов внутри и возвращает dict в приведенной выше структуре данных.

from os import listdir
from os.path import isdir, join

def scan_files(dir):
    cache = {}
    for name in listdir(dir):
        path = join(dir, name)
        if isdir(path):
            cache[name] = scan_files(path)
        elif name in ('alertfile', 'eventfile'):
            with open(path, 'r') as file:
                cache['.'][name] = file.read()
    return cache

Вы можете поместить блок внутри цикла for выше впул потоков, если вы хотите ускорить процесс.

Или, если вы предпочитаете кэшировать файлы в едином формате, вы можете использовать os.walk вместо того, чтобы обойти весь каталогв цикле.

import os
def scan_files(dir):
    cache = {}
    for root, dirs, files in os.walk(dir):
        for name in files:
            if name in ('alertfile', 'eventfile'):
                path = os.path.join(root, name)
                with open(path, 'r') as file:
                    cache[path] = file.read()
    return cache
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...