
Dmitry
18.04.2017
13:02:21
да

Oleg
18.04.2017
13:02:29
вообще не тоже самое
у тебя данных может быть на Мб 10 от силы
объясню

Google

Oleg
18.04.2017
13:04:09
1 байт это от 0 до 256
чтобы записать один байт в бинарном виде нужно места в 1 байт, как ни странно
чтобы в текстовом от 1 до 3

Dmitry
18.04.2017
13:05:29
а... понял
почему же столько оперативки съедается?

Oleg
18.04.2017
13:06:00
а это вопрос
может быть так странно работает драйвер БД

Dmitry
18.04.2017
13:07:11
для структуры хранящей один такой маршрут сделал:
cargpspoints.length;
оно вывело количество элементов:
424086

Oleg
18.04.2017
13:07:13
трек в отдельной таблице, как я понимаю

Dmitry
18.04.2017
13:07:49
Олег, было до меня, но там есть своя логика т.к. там куча иных данных еще хранится

Oleg
18.04.2017
13:08:44
имхо очень странный подход
никогда бы так не сделал

Google

Dmitry
18.04.2017
13:09:00
ну тут уж как есть...

Oleg
18.04.2017
13:09:27
так ты получишь сколько в оперативе занимает твой массив

Dmitry
18.04.2017
13:10:20
а без typeof не будет работать?
умножил, получил: 16 963 440
т.е. около 16MB в памяти

Oleg
18.04.2017
13:16:47
ну где-то так
именно сам массив
вот выдели для него заранее память и посмотри сколько тогда программа будет хавать

Dmitry
18.04.2017
13:20:06
т.е. грубо говоря если я выделю 20МБ то все влезет с запасом?

Oleg
18.04.2017
13:22:42
если ты говоришь, что сборщик отрабатывает, то остальное хз
узнал количество элементов потом выделил

Dmitry
18.04.2017
13:23:46
погоди, я же должен выделить память для массива структур:
carGPSPoint [] cargpspoints; ?
просто не пойму, как я узнаю количество элементов в структуре заранее до того как выборку из БД не сделаю?

Oleg
18.04.2017
13:30:57
ну так можно же получить COUNT не?
в sql запросе прям

Dmitry
18.04.2017
13:31:16
а...

Oleg
18.04.2017
13:31:54
auto cargpspoints = new carGPSPoint[](countOfPoints);

Google

Oleg
18.04.2017
13:32:15
а потом не добавляешь к массиву, а присваиваешь в нужном индексе нужное значение

Dmitry
18.04.2017
13:32:54
запрос:
SELECT
COUNT(*),
historygps_10002.Id,
historygps_10002.RecordDate
....
выведет одну единственную строку, а не массив строк
погоди, а можно как-то все же заставить память очиститься? Я не понимаю почему GC не вызывается т.е. пусть оно где-то стормозится на пару секунд, но чтобы как-то само очистилось

Oleg
18.04.2017
13:34:47
в sql я вообще не шарю

Dmitry
18.04.2017
13:35:10
тогда не получится узнать количество элементов. Нужно отдельный запрос делать

Oleg
18.04.2017
13:35:12
GC.collect это должен делать

Dmitry
18.04.2017
13:36:40
да в терии ни в чем, просто хочется без них, чтобы оно само как-то работало т.к. пока я определенно делаю прототип и мне затачивать скорость не очень надо, но в моем случае отъедается 1750RAM и все останавливается и непонятно как дальше быть

Pavel
18.04.2017
13:38:36
Отдельный запрос на количество данных это нормально, и вычислительную мощность экономит.
Единственный подвох - если после этого в данные что-то дописали еще то ты выделишь неправильное количество памяти.

Dmitry
18.04.2017
13:41:24
блин, оно почему-то каждый раз показывает одинаковый размер массива структур т.е. где-то он не осовобождается. Глазами вообще не вижу где может быть ошибка:

Oleg
18.04.2017
13:46:50
ну так у тебя хоть как-то меняется размер MySQLPointsLonLat?

Dmitry
18.04.2017
13:48:44
э... проверил... не меняется...
``
writeln("\nMySQLPointsLonLat: ", MySQLPointsLonLat.count);

Oleg
18.04.2017
13:50:01
ну тогда чего ты хочешь от этого массива?
ты же его каждый раз по новой заполняешь

Dmitry
18.04.2017
13:50:25
щас смотрю почему ничего не меняется....
так, а как праивльно сделать внутри функции есть переменная
string sql = "select from A"
дальше я хочу сделать замену:
sql = sql.replace("A", "B")
query(sql) ...
но проблема в том, что у меня тогда первый запрос перезапишется. Мне нужно чтобы replace работал только вниз и верхний не трогал. Я конечно могу написать:
query(sql.replace("A", "B"))
но может есть еще варианты?

Google

Dmitry
18.04.2017
14:24:01
пробую еще аппендер:
cargpspoints = appender(cargpspoint);
template std.array.appender cannot deduce function from argument types !()(carGPSPoint), candidates are:
так тоже не получается:
cargpspoints = appender!(carGPSPoint)(cargpspoint);
template std.array.appender cannot deduce function from argument types !(carGPSPoint)(carGPSPoint)

Oleg
18.04.2017
14:28:46
так у тебя же в любом случае уже есть размер массива cargpspoints
зачем тебе appender?

Dmitry
18.04.2017
14:30:10
ну тот вроде быстрее работает чем:
~=

Oleg
18.04.2017
14:31:17
так тебе вообще не нужно элементы добавлять к массиву

Dmitry
18.04.2017
14:33:19
почему? Вот тут внутри цикла я построчно объожу данные:
foreach(i, point;MySQLPointsLonLat)
{
cargpspoint.id = point[0].coerce!ulong; cargpspoint.recordDate = point[1].coerce!string;
cargpspoints ~=cargpspoint; // в массив структур
}
кладу их в структуру, а потом помешаю структуру в массив структур

Oleg
18.04.2017
14:36:13
блять
...
auto pointsLonLat = result.array;
...
// carGPSPoint[] cargpspoints;
auto cargpspoints = new carGPSPoint[](pointsLonLat.length); // хоть malloc юзай
...
foreach (i, point; pointsLonLat)
{
carGPSPoint tmp;
...
// work with tmp
...
cargpspoints[i] = tmp;
...
}
...

Admin
ERROR: S client not available

Oleg
18.04.2017
14:37:46
и, кстати, по правилам стилевым языка переменные всегда с маленькой буквы, методы тоже, а названия типов всегда с большой (у тебя там всё в разнобой)

Dmitry
18.04.2017
14:38:06
погоди, ты сделал тоже самое только с другим способом аллокации?

Oleg
18.04.2017
14:38:26
да, я один раз выделил память в начале работы, а потом заполнил массив
примерно так и нужно делать
этот способ быстрее и сборщик не вызывается в цикле, где ты по pointsLonLat проходишь
у меня рука не поднялась написать название переменной так как ты написал)
у тебя же нет никаких условий в этом цикле (добавлять элемент или нет), да и если бы были, то можно было бы так выделить и потом просто зафиксировать сколько элементов было записано, да и всё
но, скорее всего это никак не изменит потребление памяти))))

Dmitry
18.04.2017
14:41:50
%)
хороший вывод

Oleg
18.04.2017
14:42:10
потому что GC.collect должен работать корректно

Google

Oleg
18.04.2017
14:42:59
а здесь просто получается небольшая оптимизация по обращению к нему и всё
что-то другое отъедает

qwerty
18.04.2017
15:00:49
в D нельзя как в C++ объявить массив используя переменную для количества элементов в массиве?
код на С++ http://vpaste.net/4aOhB
Как аналогично сделать в D? Сделать динамический массив, а потом задать ему длину?

Oleg
18.04.2017
15:09:59
auto arr = new uint[](lengthOfArr);
в чём проблема?)

qwerty
18.04.2017
15:11:03
такой массив выделится ведь в heap?
а не в stack?

Oleg
18.04.2017
15:11:30
да

qwerty
18.04.2017
15:12:01
int[] arr;
arr.length = var;
а так в stack?

Oleg
18.04.2017
15:12:04
чтобы на стеке нужно что-нибудь другое, типа scoped или аллокаторов разных

qwerty
18.04.2017
15:12:27
понял
а так делать нельзя readf("%s", &arr[i]);?
arr это int[]

Oleg
18.04.2017
15:19:30
точно не помню, но почему нет?
всмысле возможно нужно &(arr[i])
ну или arr.ptr + i
кстати сейчас можно не только указателями, но и ссылками в этих методах пользоваться
http://dlang.org/changelog/2.074.0.html#std-format-formattedRead