TSP>Я бы импортировал всё в Postgress. При запросе создавал бы индекс по "произвольному полю", потом делал бы запрос и вывел бы его в файл. TSP>Или так нельзя?
ответил бы аналогично (особенно в свете "произвольности" поля)
но меня другое удивляет. на какую позицию такой вопрос, и где такое периодически встречается JSON в 140GB? как говорится умный это тот, который не допускает ситуации, из которых находчивый найдет выход.
Тё>Если ты их в первый раз видишь- значит ты не программист.
JSON в 140гб, серьезно? он же к вам не с неба упал, верно. если у тебя такое встречается как здрасте, то есть сомнения не в нем, а в тебе. можешь описать реальный кейс, когда такое бывает?
Здравствуйте, BrainSlug, Вы писали:
BS>JSON в 140гб, серьезно? он же к вам не с неба упал, верно. если у тебя такое встречается как здрасте, то есть сомнения не в нем, а в тебе. можешь описать реальный кейс, когда такое бывает?
Мне такой вариант встречался в реальности. Есть много серверов и на них много приложений, которые пишут логи. Нужно эти логи распарсить, отсортировать.
Но это, конечно, не очень типичный сценарий.
M>"IT depends". Давай для конкретики примем приближенное к реальности условие (по другому поводу, но было нечто близкое), например, что это текстовые логи, которые в таком объеме генерирует чей-то довольно популярный сервак в интернете за месяц. Хранятся в пожатом gzip виде и занимают чуть меньше 1Тб на диске (800-900Гб). Заказчик хочет кой-какую статистику из них извлечь, некоторые стандартные средства обработки логов ему не подходят по каким-то причинам. Полноценный анализатор городить не требуется, нужно извлечь может даже буквально пару-тройку данных.
пара-тройка данных и гигансткие логи за месяц это противоречащие условия, которые допускаю могут постфактум произойти и которые можно ad-hoc так перелопатить на один раз. а потом что? ради пары-тройки данных каждый раз гигантские логи анализировать?
CM>Мне такой вариант встречался в реальности. Есть много серверов и на них много приложений, которые пишут логи. Нужно эти логи распарсить, отсортировать. CM>Но это, конечно, не очень типичный сценарий.
да он и мне встречался(хотя шла речь о сотнях мб-гб, а не о сотнях гб). но это очень странный пример для отбора. есть задачи которые встречаются каждый день, а есть которые дай бог раз в год. и то, никто нового сотрудника сразу на такую задачу скорее всего не отправит. (хотя не знаю на какую позицию там Артемка подбирал)
Тё>>Если ты их в первый раз видишь- значит ты не программист. BS>JSON в 140гб, серьезно? он же к вам не с неба упал, верно. если у тебя такое встречается как здрасте, то есть сомнения не в нем, а в тебе. можешь описать реальный кейс, когда такое бывает?
Лог ордеров и сделок за день. Но не JSON конечно.
Здравствуйте, Тёмчик, Вы писали:
Тё>5) Дан файл из записей JSON размером 140GB, но у вас в системе всего 8GB памяти. Нужно вывести записи в другой файл, отсортированные по произвольному полю JSON. Как это сделать? (код не нужен).
Как эту решать? Можно всякие сортировки на диске (слиянием или как их там), но это долго. Я бы лично предложил посмотреть внимательно на структуру этого JSON-а. Скорее всего там записей не так много, поэтому можно сначала прочитать его, выписать размер каждой записи, её индекс и значение поля, всё это в массив, который предположительно поместится в памяти. Потом этот массив отсортировать и в один приём записать отсортированные записи в конечный файл.
Тё>4) Дан файл с integer values от 0 до 1000000, без дупликатов, но значения в произвольном порядке. Как их вывести в другой файл в порядке возрастания?
Задача шутка?
// Example program#include <stdio.h>
int main()
{
for (int i=0;i<=1000000;i++)
printf ("%d\n", s);
return 0;
}
S>Сразу видно что задача оторвана от практики и решается неким хитрым способом, который в реальных провектах никогда не понадобится.
О да, хитрее не придумаешь... Особенно решение O(n)
#include <stdio.h>
int main()
{
int a [] = {1,2,3,4,5,6,4,7,8,9,10};
long long s = 0;
for (size_t i=0;i<10;i++)
s+=(a[i]-i);
printf ("%d\n", s);
return 0;
}
Здравствуйте, Bjorn Skalpe, Вы писали:
S>>Сразу видно что задача оторвана от практики и решается неким хитрым способом, который в реальных провектах никогда не понадобится.
BS>О да, хитрее не придумаешь... Особенно решение O(n)
В условии не сказано что числа упорядочены или нет пропусков. Вот если придумаете способ найти дубликат без составления хеш таблицы или полной при условии пропусков (т.е. что, к примеру, числа 2 может вообще не быть) — тогда интересно. Не уверен что это возможно.
int[] a = new int[] {1, 3, 4, 4, 6, 7, 8, 9, 10, 11};
Здравствуйте, Bjorn Skalpe, Вы писали:
Тё>>4) Дан файл с integer values от 0 до 1000000, без дупликатов, но значения в произвольном порядке. Как их вывести в другой файл в порядке возрастания? BS>Задача шутка?
"значения в произвольном порядке" и "в порядке возрастания" надо было подчеркнуть, да. Фтопку контору без подчеркиваний!
BS>
BS>// Example program
BS>#include <stdio.h>
BS>int main()
BS>{
BS> for (int i=0;i<=1000000;i++)
BS> printf ("%d\n", s);
BS> return 0;
BS>}
BS>
Здравствуйте, Bjorn Skalpe, Вы писали:
S>>Сразу видно что задача оторвана от практики и решается неким хитрым способом, который в реальных провектах никогда не понадобится.
BS>О да, хитрее не придумаешь... Особенно решение O(n)
BS>
BS>#include <stdio.h>
BS>int main()
BS>{
BS> int a [] = {1,2,3,4,5,6,4,7,8,9,10};
BS> long long s = 0;
BS> for (size_t i=0;i<10;i++)
BS> s+=(a[i]-i);
BS> printf ("%d\n", s);
BS> return 0;
BS>}
BS>
#include <stdio.h>
int main()
{
int a [] = {0,1,2,3,4,4,5,6,7,8,9};
long long s = 0;
for (size_t i=0;i<10;i++)
s+=(a[i]-i);
printf ("%d\n", s);
return 0;
}
Результат: -5
То есть решение работает только для отсортированных, натуральных чисел без пропусков с одним дубликатом в произвольном месте.
Из 4 требований алгоритма в условиях задачи есть только одно.
А уж требование сортированного массива особенно смешно: CM>>Очень много оперативки выжрется. Лучше просто отсортировать и далее искать. BS>Если мозга нет, то да...
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Bjorn Skalpe, Вы писали:
S>>>Сразу видно что задача оторвана от практики и решается неким хитрым способом, который в реальных провектах никогда не понадобится.
BS>>О да, хитрее не придумаешь... Особенно решение O(n)
S>В условии не сказано что числа упорядочены или нет пропусков. Вот если придумаете способ найти дубликат без составления хеш таблицы или полной при условии пропусков (т.е. что, к примеру, числа 2 может вообще не быть) — тогда интересно. Не уверен что это возможно.
Причем тут упорядоченность? А пропусков нет, потому что дано от 1 до 2^32-1 чисел в файле и только одно повторяется, спрашивается какое, а не 10 файлов разной размерности.
Да ты что, алгебру не учили в школе? Даже не попробовал запускать? А ты попробуй поменять местами...
Например так:
#include <stdio.h>
int main()
{
int a[] = {8, 6, 3, 1, 4, 5, 7, 2, 4, 9};
long long s = 0;
for (size_t i=0;i<10;i++)
s+=(a[i]-i);
printf ("%d\n", s);
return 0;
}
По поводу ваших данных, где тут сказано, в условиях задачи, что должны быть пропуски, где цифра 2, 5, куда они пропали?
S>
S>int[] a = new int[] {1, 3, 4, 4, 6, 7, 8, 9, 10, 11};
S>
Как этот массив, который вы даете отвечает условию задачи?
Здравствуйте, aik, Вы писали:
aik>Здравствуйте, Bjorn Skalpe, Вы писали:
Тё>>>4) Дан файл с integer values от 0 до 1000000, без дупликатов, но значения в произвольном порядке. Как их вывести в другой файл в порядке возрастания? BS>>Задача шутка?
aik>"значения в произвольном порядке" и "в порядке возрастания" надо было подчеркнуть, да. Фтопку контору без подчеркиваний!
BS>>
BS>>// Example program
BS>>#include <stdio.h>
BS>>int main()
BS>>{
BS>> for (int i=0;i<=1000000;i++)
BS>> printf ("%d\n", s);
BS>> return 0;
BS>>}
BS>>