
Oleg
28.04.2017
10:19:43
и там обработка происходит
запись же должна как-то блокировать базу
если ты с двух-трёх потоков будешь писать в базу одновременно, то прироста не должно быть

Dmitry
28.04.2017
10:20:20
а база на уровне таблиц блокируется обычно?

Google

Oleg
28.04.2017
10:20:28
я хз

Maxim
28.04.2017
10:20:29
я бы протестировал на ограниченном наборе данных

Dmitry
28.04.2017
10:20:52
ладно потом тогда как будет время потестирую)

Oleg
28.04.2017
10:21:01
а по описанию твоей программы там особо то и не ускориться

Dmitry
28.04.2017
10:21:34

Oleg
28.04.2017
10:25:49
Я так и не понял что ты тут имеешь ввиду %)
если ты хочешь писать вот так
infof("some data %s", data);
то нужно использовать перезапись переменной sharedLog
иначе с твоим fLogger нужно будет писать так
fLogger.infof("some data %s", data);
и если есть библиотека, которая сама логирует что-то, то она точно ничего не будет знать о твоём fLogger
само наличие глобальной переменной fLogger не заставляет переводить в неё всё логирование

Dmitry
28.04.2017
10:26:22
ай! все спасибо! теперь понял!
а бывает вообще что либа что-то логирует? Т.е. я просто никогда не видел что бы в доке было написано, что-то про логирование. Обычно только про исключения пишут.
Объект sharedLog он всегда один получается?

Oleg
28.04.2017
10:28:36

Google

Oleg
28.04.2017
10:29:19
а так много библиотек что-то логируют
и причём достаточно обильно в зависимости от флагов

Dmitry
28.04.2017
10:30:00
т.е. нужно лишь логер объявить и оно дальше будет писать все из всех либ?

Oleg
28.04.2017
10:30:13
нет
во первых глобальная переменная sharedLog объявлена он в std.experimental.logger и тебе объявлять не нужно
во вторых если в библиотеке нет логирования, то оно не появится
оно должно как-то включаться
если оно есть

Dmitry
28.04.2017
10:33:16
static this()
{
sharedLog = new FileLogger("ProcessingLog.txt");
}
void main()
{
вот так норм?

Oleg
28.04.2017
10:33:54
да

Pavel
28.04.2017
10:44:22

Oleg
28.04.2017
10:44:50
ну может быть

Pavel
28.04.2017
10:45:04
По крайней мере постгрес с этим очень плотно дружит
Я бы даже попробовал одновременно писать и читать несколько десятков треков

qwerty
28.04.2017
10:50:55
Никто не знает. Если функция вложенная, может ли она быть pure?
char[] process() pure {
char[] res = ['a', 'b', 'c'];
return res;
}
immutable char[] buf = process();
Этот кусок кода внутри метода. Но не дает скомпилировать, потому что не может преобразовать char[] к immutable char[], однако если вынести функцию process за пределы метода, то компилируется как ожидалось.

Oleg
28.04.2017
10:52:02
можно делать pure
но что-то смахивает на косяк
то что он даёт char[] к immutable char[]

qwerty
28.04.2017
10:53:20
если pure то так можно
pure гарантирует, то что результат не присвоен к какой-то глобальной переменной или статическому полю

Google

qwerty
28.04.2017
10:54:21
говорю, что если метод вынести (т. е. он перестанет быть вложенным), то это работает
pure на самом деле не совсем это гарантирует

Oleg
28.04.2017
10:54:45
вот только хотел написать

qwerty
28.04.2017
10:54:52
ага

Oleg
28.04.2017
10:55:34
а массив res изменяется внутри process?

qwerty
28.04.2017
10:57:03

Oleg
28.04.2017
10:57:39
тогда можно смело idup делать после вызова process

qwerty
28.04.2017
10:58:04
можно, но я могу делать это же и без pure

Oleg
28.04.2017
10:58:14
и это тоже верно
я вот сейчас подумал и понял, что не понимаю что должно произойти вообще по логике с таким расскладом
сборщик же не должен использоваться для литералов?

qwerty
28.04.2017
10:59:29
о_О

Oleg
28.04.2017
10:59:29
где тогда выделяется массив?

qwerty
28.04.2017
10:59:38
аа

Oleg
28.04.2017
10:59:44
если на стеке, то возвращать его из функции это как-то не хорошо
а если в куче (и сборщик всё-таки используется), то это не pure же тогда получается
так как этот участок памяти можно изменить
или тогда он должен создавать каждый раз новую память
надо проверить

qwerty
28.04.2017
11:00:46

Google

qwerty
28.04.2017
11:01:21
ладно, я на форум стукну

Oleg
28.04.2017
11:02:46
литерал использует gc
каждый раз выделяется новая память
вообще неявное приведение к immutable должно блокироваться системой типов

qwerty
28.04.2017
11:03:49
для pure не должно
в книжке у Ruppe написано
и на Dconf 2013 в докладе Ali есть информация

Oleg
28.04.2017
11:05:06
тоесть если из pure функции возвращается какая-то область памяти, то явно указтель на неё один и можно сделать её immutable?
в этом логика?

qwerty
28.04.2017
11:05:45
да

Admin
ERROR: S client not available

Oleg
28.04.2017
11:06:35
если метод process объявить внутри другого как static то всё работает
даже без pure

qwerty
28.04.2017
11:07:02
литерал использует gc
То есть если сделать так
char[] buf;
buf.length = 3;
buf[0] = 'a';
buf[1] = 'b';
buf[2] = 'c';
То GC не вызовется?

Oleg
28.04.2017
11:07:06
что достаточно странно
buf.length = 3; перевыделяет память

qwerty
28.04.2017
11:07:56
?

Oleg
28.04.2017
11:10:37
не понял юмора
я про литерал массива думал, но по всей видимости используется gc для динамических массивов всегда

Google

Oleg
28.04.2017
11:12:08
int[] a = [1,2,3]; будет использовать gc
int[3] a = [1,2,3]; не будет

qwerty
28.04.2017
11:13:38
int[3] a = [1,2,3]; так совсем не интересный(
нельзя вместо размера указать переменную

Oleg
28.04.2017
11:16:54
Ну это понятно

Dmitry
28.04.2017
13:52:02
а разве нельзя сделать так. скомпилить, переименовать исполняемый файл в том же каталоге в app2 запустить его, начать доработку проекта и скомпилировать его под app1. у меня при этой попытке ругается что не может получить доступ к app1 хотя app1 файла такого даже нет. Есть только app2
причем опять линкер ругается
а в Ди есть какие-то фишки с тем, что при касте float в стринг происходит округление?
конкретно проблема и типов Variant который БД возвращает.
point[3].coerce!string
округляет значение до 3 знака, а оригинальное содержит в себе 6 знаков
writeln(point[3].coerce!float);
тоже возвращает:
56.0512
Вместо
56.051151

Oleg
28.04.2017
16:14:31
К ди напрямую не относится

Dmitry
28.04.2017
16:15:38
думаешь? но вроде тип используется дишный для данных
Я проверил:
void main()
{
Variant b = 56.051151;
float x = b.coerce!float;
writeln(x);
}
>56.0512

Александр
28.04.2017
16:36:51
А если вывести просто 56.051151?

Dmitry
28.04.2017
16:36:55
Хотя я не понял. Там еще Algebraic а Variant вроде бы с закруглением %)
Проблема в том, что БД возвращает Variant

Александр
28.04.2017
16:40:08
Может он в выводе округляет
Реально там вообще может быть 56.05115100000267499502

Dmitry
28.04.2017
16:48:57
блин, все разобрался. проблема в том, что writeln проводит округление
или нет %)
короче нужно отдохнуть
а то уже тупить начал
а хотя вроде да %)