Я потянув данные из гигантских текстовых файлов, в секции я заинтересован выглядеть какЭффективно захватывать переменное число шаблонов с помощью регулярного выражения Julia?
...
section:NumberOfSurvivorsPerVault
subsection:1958
xy:1_1034
xy:2_2334
subsection:1959
xy:1_1334
xy:2_2874
xy:7_12
...
section:MeanCapsPerGhoul
subsection:1962
xy:1_234
xy:2_121
....
Разделы/подразделы случайным образом разбросаны по всему текстовому файлу и имеют переменное количество пара х. Сейчас я readall'ing полный текст и захвата каждого и добавить их к dataframe с:
function pushparametricdata(df, full)
for m = eachmatch(r"section:(.*)\r\nsubsection:([0-9]*)\r\n((xy:[0-9]*_.*?\r\n)+)"m, full)
for r = eachmatch(r"xy:([0-9]+)_(.*?)\r\n"m, m.captures[3])
push!(df, [m.captures[1], int(m.captures[2]), int(r.captures[1]), float(r.captures[2])])
end
end
end
Это хорошо работает, но я думаю, что это выделяет, по крайней мере в два раза больше памяти, чем это необходимо в связи с два регулярных выражения и @time показывает, что 80% пробега - gc. Можно ли это сделать без промежуточной копии? (Из того, что я могу сказать, это невозможно сделать с помощью одного регулярного выражения).
Вы можете попытаться использовать только ['(? M) (?:^| \ G) xy: ([0-9] +) _ (. *)'] (Https: // regex101.com/r/nN9tB5/2): 'function pushparametricdata (df, full) для m = eachmatch (r" (? m) (?:^| \ G) xy: ([0-9] +) _ (. *) «m, full) push! (df, [m.captures [1], int (m.captures [2]), int (r.captures [1]), float (r.captures [2]) ]) конец конец'. Вот [демонстрация, показывающая, что я имею в виду] (http://goo.gl/EMe3lj). –
Хорошая мысль, но я боюсь, что у меня много разных разделов, и у каждого есть разные числа xy-пар и подразделов. – ARM
Хорошо, как насчет оптимизации первого регулярного выражения? Попробуйте секцию '' (? S): (. *?) Подраздел: ([0-9] +) \ s + ((?:: yy: [0-9] * _ [^ \ n] + \ r? \ N) +) '] (https://regex101.com/r/nN9tB5/5). Второе регулярное выражение может быть 'xy: ([0-9] +) _ ([^ \ n] *)'. –