Я предполагаю, что вы хотите работать с несколькими файлами одновременно. Для этого лучший способ (на мой взгляд) - использовать multiprocessing
. Чтобы использовать это, вам нужно определить элементарный шаг, и это уже сделано в вашем коде.
import numpy as np
import multiprocessing as mp
import os
def compute(file):
mindex=np.zeros((1200,1200))
for i in range(1200):
var1 = xray.open_dataset(file)['variable'][:,i,:].data
for j in range(1200):
var2 = var1[:,j]
## Mathematical Calculations to find var3[i,j]##
mindex[i,j] = var3[i,j]
return (file, mindex)
if __name__ == '__main__':
N= mp.cpu_count()
files = os.scandir(folder)
with mp.Pool(processes = N) as p:
results = p.map(f, [file.name for file in files])
Это должно вернуть список элементов results
, в котором каждый элемент является кортежем с имя файла и матрицу mindex. При этом вы можете работать с несколькими файлами одновременно. Это особенно эффективно, если вычисление для каждого файла длинное.
Сначала вместо создания постоянной таблицы я просто изменил ее на временную таблицу.
Итак, учитывая ваш пример, я пришел к следующему:
WITH CTE as(
select ROW_NUMBER() OVER(ORDER BY BLOCK) RN, LAG(Value1,1,VALUE1) OVER (ORDER BY BLOCK) LG,
GatewayDetailID, Block, Value1,Value2,Vaule3
from #tmp
),
CTE2 as (
select *, CASE WHEN LG <> VALUE1 THEN RN ELSE 0 END RowMark
from cte
),
CTE3 AS (
select MIN(Block) BL, RowMark from CTE2
GROUP BY ROwMark
),
CTE4 AS (
SELECT GatewayDetailID,Block,Value1,Value2,Vaule3,RMM from cte2 t1
CROSS APPLY (SELECT MAX(ROWMark) RMM FROM CTE3 t9 where t1.Block >= t9.ROwMark and t1.RN >= t9.RowMark) t2
)
SELECT GateWayDetailID,Block,Value1,Value2,Vaule3, ROW_NUMBER() OVER(Partition by RMM ORDER BY BLOCK) RN
FROM CTE4
ORDER BY BLOCK
Сначала мне нужно было получить номер строки для всех строк, а затем в зависимости от того, когда значение1 изменилось, я отметил это как новая группа. Из этого я создал CTE с датой и строкой границы для каждой группы. И, наконец, я перекрестно применил это обратно к таблице, чтобы найти каждую строку в каждой группе.
Из этого последнего CTE я просто применил простую функцию ROW_NUMBER (), разделенную на каждую группу RowMarker и номера строк poof ....
Возможно, есть лучший способ сделать это, но именно так я логически работал над этой проблемой.