Это действительно не так, как работает Spark.
Код, помещенный в foreachPartition
, выполняется в ином контексте, чем оригинал
List finalJsonMap = new ArrayList();
Все, что вы можете сделать в такой настройке, - это изменить локальную копию.
Это многократно обсуждалось при переполнении стека и подробно описано в официальной документации в разделе «Понимание замыканий» .
Учитывая требуемый результат (то есть локальную коллекцию), на самом деле вы ничего не можете сделать, кроме как преобразовать свой код в mapPartitions
и collect
. Это, однако, вряд ли эффективно или идиоматично в Spark.
Я настоятельно рекомендую переосмыслить ваш текущий дизайн.
Один фактор, который может усложнить, вставляет, когда база данных растет, количество индексов на таблице и глубина тех индексов, если они - B-деревья или подобный. Существует просто больше работы, чтобы сделать, и может случиться так, что Вы заставляете индексные узлы разделять, или Вы, возможно, просто переместились от, скажем, 5-уровневого B-дерева до 6-уровневого (или. в более общем плане, от N до уровней N+1).
Другим фактором могло быть использование дискового пространства - при использовании приготовленных файлов (это - нормальный вид для большинства людей большую часть времени; некоторый DBMS использует 'необработанные файлы' на Unix, но маловероятно, что Ваша встроенная система сделала бы так, и Вы будете знать, сделал ли он, потому что необходимо было бы сказать ему делать так), могло случиться так, что большие таблицы теперь фрагментируются через диск, ведя к худшей производительности.
Если бы проблема была на ИЗБРАННОЙ производительности, то могло бы быть много других факторов, также влияющих на производительность Вашей системы.
Это звучит о праве. Производительность базы данных обычно значительно отбрасывает, поскольку данные больше не могут быть сохранены в памяти, и операции становятся связанным диском. Если Вы используете нормальные операции вставки и хотите значительное повышение производительности, я предлагаю использовать своего рода объемная загрузка API, если H2 поддерживает его (как Oracle sqlldr, Sybase BCP, Mysql 'данные загрузки infile'). Этот тип API пишет данные непосредственно в файл данных, обходящий многие подсистемы базы данных.
Это, скорее всего, вызывается полями переменной ширины. Я не знаю, позволяет ли H2 это, но в MySQL, необходимо составить таблицу со всеми фиксированными полями ширины, затем явно объявить это как фиксированную полевую width таблицу. Это позволяет MySQL вычислять точно, где он должен войти в файл базы данных, чтобы сделать вставку. Если Вы не используете фиксированную таблицу width, то она должна прочитать таблицу для нахождения конца последней строки.
Добавление данных (при правильной организации) является O (n) операция, где n является длиной данных, которые будут записаны. Это не зависит от длины файла, существует, ищут операции для перескакивания через это легко.
Много механизмов базы данных создают неявный целочисленный первичный ключ для каждого обновления, поэтому даже если Вы не объявили индексов, Ваша таблица все еще индексируется. Это может быть фактором.
Другая причина состоит в том, сохранена ли вся база данных в памяти или если ОС должна сделать большой обмен с диском, чтобы найти, что местоположение хранит запись.
Я возложил бы ответственность за него на ввод-вывод, особенно если Вы выполняете свою базу данных по нормальному ПК с нормальным жестким диском (этим, я имею в виду не в сервере с супер быстрыми жесткими дисками, и т.д.).
Для большинства баз данных, добавляя в файл базы данных определенно медленнее, чем предварительный рост файла и затем добавление строк. Посмотрите если поддержки H2, предварительно выращивающие файл.
Использование H2 для файла данных 7G - неправильный выбор из технологическая точка зрения. Как вы сказали, встраиваемый. Какое у вас «встроенное» приложение, если вам нужно хранить столько данных.