Эта задача всегда включает чтение в память и запись обратно, независимо от того, находятся ли эти массивы под контролем пользователя или скрыты.
Существует одно возможное исключение, если вы хотите прочитать TBaskets из одного файла и записать их другому, не распаковывая их - тогда они все еще находятся в памяти, но не распакованы, и это может повысить производительность. ROOT может сделать это как «быстрое копирование», но Up root не имеет эквивалента. Такая копия потребует, чтобы вы не хотели каким-либо образом изменять данные в TBaskets, в том числе нарезку на произвольных границах событий, что может быть проблемой, если TBaskets для 8 интересующих вас TBranches не совпадают на общих границах событий. (Такая функция может быть добавлена к Uproot - технических ограничений нет, но эта функция полезна только в определенных случаях.)
Таким образом, процесс чтения массивов из одного файла и записи их в другой примерно так же хорошо, как и с вышеупомянутым предостережением.
Я не уверен, что вы подразумеваете под "каталогом в Python."
Чтобы ответить на ваш второй вопрос, массивы, которые считываются из TTree, выровнены в том смысле, что запись 555
одного TBranch принадлежит тому же событию, что и запись 555
другого TBranch. Это распространенный способ работы с наборами массивов в NumPy, хотя это необычный способ работы с ROOT данными; в ROOT событие - это объект, или, по крайней мере, вы не видите более одного объекта за раз.
Если у вас есть проблемы с памятью (вероятно, не с 8 TBranches × 4 миллиона событий, не зубчатые , = 244 МБ ОЗУ (с двойной точностью), то вы можете рассмотреть возможность итерации:
numtraining = int(0.8*ttree.numentries)
numtest = ttree.numentries - numtraining
for chunk in ttree.iterate("*", entrysteps="1 GB", entrystop=numtraining):
training.extend(chunk)
for chunk in ttree.iterate("*", entrysteps="1 GB", entrystart=numtraining):
test.extend(chunk)
Это дает вам контроль над размером выходных TBaskets, поскольку каждый TBranch получает один TBasket за вызов extend
, Приведенный выше пример гарантирует, что набор TBranches, которые все должны использоваться вместе, состоит максимум из 1 ГБ.
В отличие от «быстрого копирования» (см. Выше), то, что вы делаете, это не просто копирование он также перераспределяет данные, что может повысить производительность при чтении этих выходных файлов. Как правило, более крупные фрагменты (большие TBaskets) читаются быстрее, но слишком велики и могут потребовать слишком много памяти.