Как добавить разреженный домен в часовню
Я заполняю разреженный массив в Chapel циклом, который читает через CSV.
Мне интересно, какая модель лучше.
var dnsDom = {1..n_dims, 1..n_dims};
var spsDom: sparse subdomain(dnsDom);
for line in file_reader.lines() {
var i = line[1]:int;
var j = line[2]:int;
spsDom += (i,j);
}
Это эффективный способ сделать это?
Должен ли я создать временный массив кортежей и добавить spsDom
каждые (скажем) 10000 строк?
Спасибо!
1 ответ
То, как вы показываете во фрагменте, будет расширять внутренние массивы разреженного домена на каждом +=
операция. Как вы предложили; каким-то образом буферизует индексы чтения, а затем их массовое добавление определенно будет работать лучше благодаря нескольким оптимизациям для добавления массива индексов.
Вы можете так же сделать +=
где правая часть является массивом:
spsDom += arrayOfIndices;
Это перегрузка +=
оператор на разреженных доменах фактически вызывает основной метод массового сложения bulkAdd
, У самого метода есть несколько флагов, которые могут помочь вам увеличить производительность в некоторых случаях. Обратите внимание, что +=
перегрузка вызывает bulkAdd
метод "самым безопасным" способом. то есть массив индексов может быть в случайном порядке, может включать дубликаты и т. д. Если у вас есть массивы (в ваших случаях индексы, которые вы читаете из файла), удовлетворяют некоторым требованиям (заказаны ли они? Есть ли дубликаты? Вам нужно сохранить входные данные? массив?), вы можете использовать bulkAdd
напрямую и передать несколько флагов оптимизации.
См. http://chapel.cray.com/docs/latest/builtins/internal/ChapelArray.html для документации по bulkAdd
,
Редактировать: здание фрагмента поверх рассматриваемого:
var dnsDom = {1..n_dims, 1..n_dims};
var spsDom: sparse subdomain(dnsDom);
//create an index buffer
config const indexBufferSize = 100;
var indexBufferDom: {0..#indexBufferSize};
var indexBuffer: [indexBufferDom] 2*int;
var count = 0;
for line in file_reader.lines() {
indexBuffer[count] = (line[1]:int, line[2]:int);
count += 1;
// bulk add indices if the buffer is full
if count == indexBufferSize {
spsDom.bulkAdd(indexBuffer, dataSorted=true,
preserveInds=false,
isUnique=true);
count = 0;
}
}
// dump the final buffer that is (most likely) partially filled
spsDom.bulkAdd(indexBuffer[0..#count], dataSorted=true,
preserveInds=false,
isUnique=true);
Я не проверял это, но я думаю, что это должно охватить основную идею. Флаги, переданные на bulkAdd, должны обеспечить лучшую производительность. Конечно, это зависит от того, какой входной буфер отсортирован и не содержит дубликатов. Кроме того, обратите внимание, что начальный объем Add будет намного быстрее по сравнению с последовательными. И они, вероятно, станут медленнее, так как метод должен просеять существующие индексы и сместить их при необходимости. Таким образом, больший буфер может обеспечить лучшую производительность.