@dlangru

Страница 155 из 719
Dmitry
17.04.2017
08:59:35
т.е. в итоге ничего не выводится

Oleg
17.04.2017
09:21:48
тип то как раз компилятору максимально понятен) просто не подходит

Dmitry
17.04.2017
09:29:41
да ты прав, он input range

Google
Dmitry
17.04.2017
09:30:04
это можно как-то обойти или без вариантов?

Maxim
17.04.2017
09:30:19
без вариантов

либо, сделать свой range, который будет читать _всё_ и давать к этому свободный доступ

но, очевидно, это будет очень неоптимально по памяти в случае большой выборки)

Dmitry
17.04.2017
09:44:57
Олег, а я правильно понимаю, что лямбды с Range не могут работать, а только с array?

получает данные: auto x = MySQLTablesRange.array.filter!(a=>a[0].coerce!string.canFind("_")); не получает данные: auto x = MySQLTablesRange.filter!(a=>a[0].coerce!string.canFind("_"));

могу я как-то выполнить фильтрацию данных в самом элементе не создавая дополнительных переменных? сейчас оно выглядит так: auto x = MySQLTablesRange.array.filter!(a=>a[0].coerce!string.canFind("_"));

а можно кортеж создать не инициализируя его? auto historyTuple = Tuple!(string, "gps", string, "sensor"); ругается: type Tuple!(string, "gps", string, "sensor") has no value

qwerty
17.04.2017
11:49:24
RTFM

https://dpaste.dzfl.pl/ccf03df8f119

http://dlang.org/phobos/std_typecons.html#tuple

Dmitry
17.04.2017
12:00:07
угу, спасибо

а как мне через filter! выбрать только данные где есть строка т.е. auto historysensor = MySQLTablesRange.array.filter!(a=>a[0].coerce!string.canFind("historysensor")); оно не канает. canFind тут явно не к тмоу

Google
Oleg
17.04.2017
12:51:16
Лямбда это просто лямбда

в том смысле, что это просто функция

как ты отправляешь в неё данные это уже к ней мало относится (только ref или нет важно)

Dmitry
17.04.2017
13:09:07
судя по всему у меня сейчас в переменную попадает тип от MYSQL ROW auto historysensor = MySQLTablesRange.array.filter!(a=>a[0].coerce!string.canFind("historysensor")); как мне от него избавиться? я хочу просто чтобы у меня там масив простой был, чтобы не по индексу обращаться, и без дополнительной конвертации coerce!string. foreach(sensor;historysensor) { sensor[0].coerce!string.split("_")[1] } Если без индекса, то выводится: Row([historysensor_10774], [false])

короче это все лучше через map! пропустить, чтобы потом работать уже с массиовом значений без всех этих .coerce!string

auto historysensor = MySQLTablesRange.array.map!(a => a[0].coerce!string).filter!(a=>a.canFind("historysensor"));

Oleg
17.04.2017
14:20:25
кстати, если сортировать не нужно, то можно без array

Dmitry
17.04.2017
14:20:48
не получается без array :( пустоту возвращает. Не знаю почему

блин, опять ему что-то не нравится Error: cannot implicitly convert expression (filter(historygps)) of type FilterResult!(__lambda6, FilterResult!(__lambda4, MapResult!(__lambda3, Row[]))) to string вот код: gpsandsensortuple.gps = historygps.filter!(a=>a.canFind(48));

вроде бы у меня historygps давно содержит массив: immutable(char)[]

так, кажется косяк в том что данные почему-то в переменную не попадают...

вооо, Проблема вот в чем (не знаю как побороть). Есть код: ResultRange MySQLTablesRange = mysqlconnection.query(`SELECT * FROM TABLENAME`); auto historysensor = MySQLTablesRange.array.map!(a => a[0].coerce!string).filter!(a=>a.canFind("historysensor")); auto historygps = MySQLTablesRange.array.map!(a => a[0].coerce!string).filter!(a=>a.canFind("historygps")); После выполнения auto historysensor = MySQLTablesRange из range исчезают все данные т.е. они "выбираются" или не знаю как сказать. В итоге во второй переменной потом уже пусто. Как это побороть можно?

Grigirii
17.04.2017
14:53:22
самое простое - сохранить MySQLTablesRange.array в третью переменную и потом пользоваться. Это ещё и быстрее будет

Dmitry
17.04.2017
14:53:44
до этого я уже додумался, а еще как-то можно?

Grigirii
17.04.2017
14:54:57
проверь наличие save на MySQLTablesRange, если есть, то можно его сохранять. Но если ты потом зовёшь array, то лучше сохранять его - лучше один раз выделять память, а не 2

либо второй раз из базы выбирать, но тут явно разультат маленький, можно не запариваться эффективностью и работать с массивами

Dmitry
17.04.2017
14:56:21
"Make the ResultSet behave as a random access range - save +/ property ResultSet save() pure nothrow" кажись есть

а вроде и нет: Error: no property 'save' for type 'ResultRange'

https://github.com/mysql-d/mysql-native/blob/4eaf5c6bb57d4ca852aa7fa5e8d2cd8810c0808a/source/mysql/result.d#L305

Google
Grigirii
17.04.2017
14:57:18
а, так это ещё и random access? тогда зачем array? выглядит странно

Dmitry
17.04.2017
14:57:28
ай, у меня же ResultRange

без array не работает :(

Grigirii
17.04.2017
14:58:16
потому и не работает, что Range не RA. сохраняй массив и работай с ним, так и проще и читабельние и эффективнее

Dmitry
17.04.2017
14:58:24
угу, хорошо

Grigirii а что ему тут может не нравиться? foreach(sensor;historysensor) gpsandsensortuple.gps = historygps.filter!(a=>a.canFind(48)); пишет: cannot implicitly convert expression (filter(historygps)) of type FilterResult!(__lambda6, FilterResult!(__lambda4, MapResult!(__lambda3, Row[]))) to string

Grigirii
17.04.2017
15:05:52
gps - string, результат filter - Voldemort тип. если хочешь строку, то .array

gpsandsensortuple.gps = historygps.filter!(a=>a.canFind(48)).array;

Dmitry
17.04.2017
15:07:01
Grigirii тут есть проблема. filter массив строк возвращает...

как мне обратиться к первой и единственной найденной?

Grigirii
17.04.2017
15:07:45
для начала, почему этот код в цикле? он от sensor вообще не зависит

Dmitry
17.04.2017
15:08:04
пока это для теста

Dmitry
17.04.2017
15:08:13
потом я туда данные от sensor вкручу

Grigirii
17.04.2017
15:09:15
ок, тогда тебе не фильтр нужен а find

хотя пофиг, просто сохраняй результат фильтра в auto filtered = ....; проверяй, что он не пуст и бери front() с него.

Dmitry
17.04.2017
15:11:29
а как нить так можно? (у меня не компилистя) gpsandsensortuple.gps = historygps.filter!(a=>a.canFind(48)).array.popFront;

popFront cannot deduce function from argument types !()(string[]),

вот так скоипилилось: historygps.filter!(a=>a.canFind(48)).array.front;

Oleg
17.04.2017
15:14:07
а ты удостоверился, что данные не попадают?

может это просто "лень"?

Google
Oleg
17.04.2017
15:14:32
типа производить выборку, только когда к элементам обращаешься

Dmitry
17.04.2017
15:15:41
что данные не пропадают? Ну да: historysensor.array.each!(a=>a.writeln); и historygps.array.each!(a=>a.writeln); работают нормально

front — просто взять первый элемент, а popFront взять первый и убрать его из оригинального массива так?

Grigirii
17.04.2017
15:19:20
не взять, просто убрать

в остальном да

qwerty
17.04.2017
16:34:51
я так понимаю, (int a)=>a это аналог int delegate(int a) { return a; }?
вот так еще можно https://dpaste.dzfl.pl/81aa054d393c

Dmitry
18.04.2017
07:53:37
Я делаю запрос к БД иногда поля могут быть пустыми. foreach(point;MySQLPointsLonLat) { cargpspoint.speed = point[0].coerce!uint; Соотвтетственно код выше упадет при попытке выполнить конвертацию типа. Вопрос. Можно ли как-то максимально коротко сделать проверку есть ли там данные или нет? Чтобы не городить if (point[0].length > 0)

Oleg
18.04.2017
08:25:24
А какое число то должно быть в итоге на месте пустого поля?

Admin
ERROR: S client not available

Dmitry
18.04.2017
08:26:01
ноль я думаю норм

Подскажите в плане архитектуры. Делаю большую вбыорку из MySQL. На основе этой выборки надо сделать операцию выборки уже в другой БД (PostgreSQL). Как лучше сделать. Сейчас у меня есть функция: void getSingleTrackInfo() { // заполняем массив структур определенный глобально } Я вот думаю. На сколько глобальный массив будет злом? Или стоит сделать чтобы эта функция возвращала данный массив структур? Типа: myPoints [] getSingleTrackInfo() { return myPoints; } Просто если я захочу эту выборку допустим в несколько потоков делать, то тогда что? Не будет ли у меня глюков если я функция будет возвращать данный тип?

Oleg
18.04.2017
08:36:18
ноль я думаю норм
Уверен, что это не валидное значение?

Dmitry
18.04.2017
08:37:23
а ты как бы сделал если бы чисто теоретически какое-то значение могло бы отсутствовать?

Oleg
18.04.2017
08:37:51
Только если не целое

Есть вроде удобный метод для случаев когда надо вернуть значение всегда: типа если вычисление первого аргумента провалится то вернет второй

Но я не помню как называется

Да и самому написать его не проблема ?

Dmitry
18.04.2017
08:55:09
я праивльно понимаю, что writeln блокирующая операция? Просто без прогресс-бара программа отрабатывает за 5 секунд, а с ним около 15. Использую вот этот бар https://github.com/kotet/progress/blob/master/examples/bar/source/app.d с 400тыс значений

да, тормозило из-за вывода writeln

Oleg
18.04.2017
11:01:04
да, тормозило из-за вывода writeln
именно writeln или всё-таки progress bar?

Google
Dmitry
18.04.2017
11:01:14
вопрос. После загрузки дампа таблицы в программу программа в памяти 200МБ занимает. Тот же дамп выгруженный на диск занимает 35МБ откуда такая разница? Данные загружаю в массив структур

Oleg
18.04.2017
11:01:32
может внутри этой библиотеки есть слипы

Dmitry
18.04.2017
11:01:32
из-за прогресс-бара, хотя если writeln простой делать тоже медленно работает

сделал шигалку по процентам и тормозить перестало

Pavel
18.04.2017
11:02:32
вопрос. После загрузки дампа таблицы в программу программа в памяти 200МБ занимает. Тот же дамп выгруженный на диск занимает 35МБ откуда такая разница? Данные загружаю в массив структур
Данные в памяти могут храниться в сложных структурах, иметь дополнительные метаданные или индексы для ускорения работы. Так что памяти может занимать больше.

Сильно зависит от того как программа хранит этот дамп у себя в памяти.

Вообще вопрос о том сколько занимает программа памяти - крайне сложный и неоднозначный

Dmitry
18.04.2017
11:04:13
в какую сторону обычно нужно думать, чтобы снизить потребление памяти?

Pavel
18.04.2017
11:05:00
По-хорошему я думаю надо снимать дамп памяти и искать там что где и как хранится

Dmitry
18.04.2017
11:29:37
Так, нужно помощь коллективного разума. Программа в цикле выполняет обращение к БД (каждый раз читает новые данные) и кладет их в переменную. Я ожидал, что каждый раз программа будет эту переменную пеерсоздавать заново и потребление памяти будет падать. Однако у меня получается, что программа начинает есть все больше памяти пока не доходит до 1800MB RAM после чего зависает. Вопросы. 1. Почему память на каждом шаге не освобождается? 2. Как ее освобождать и это причуюды сборщика мусора или что?



qwerty
18.04.2017
11:48:12
Возможно GC. В цикле он точно вызывается при добавлении элемента в массив. Можно сделать статический массив, посчитав сначала количество точек.

Dmitry
18.04.2017
11:51:31
Тоесть ты предлагаешь умножить количество id на максимальный размер ulong потом количество velocity умножить на int и тд и сложить все это вместе?

qwerty
18.04.2017
12:03:48
иисусья тряпка, как тебе такое в голову пришло?))

carGPSPoints[MySQLPointsLonLat.count] cargpspoints;

Dmitry
18.04.2017
12:05:50
ну я создам n структур таким образом, как это мне поможет?

Oleg
18.04.2017
12:12:39
вот прям чувствую что MySQLPointsLonLat.count не константа

не константа времени компиляции

qwerty
18.04.2017
12:15:50
ну да

виноват

Страница 155 из 719