1

I'm trying to create a script that uses the Slick Code Generator to map an entire database to a Scala file, running up a docker container, and executing the ddl on a database running inside of it, effectively rebuilding the database every time it's run.

This actually works great(I only have to edit the very first line of the file, removing the package declaration), but only if I trim the Tables.scala(the output file) down to just one mapping, it generates the associated table in a fresh instance of the database(using "Tables.ddl.createStatements").

The problem is that the full file is 8k+ lines of generated code, and every time it tries to compile (running "amm buildDatabase.sc"), this exception is thrown:

java.lang.OutOfMemoryError: Java heap space
  java.lang.reflect.Array.newArray(Native Method)
  java.lang.reflect.Array.newInstance(Array.java:75)
  scala.collection.mutable.ArrayOps.slice(ArrayOps.scala:48)
  scala.collection.mutable.ArrayOps.slice$(ArrayOps.scala:44)
  scala.collection.mutable.ArrayOps$ofChar.slice(ArrayOps.scala:227)
  scala.collection.IndexedSeqOptimized.drop(IndexedSeqOptimized.scala:140)
  scala.collection.IndexedSeqOptimized.drop$(IndexedSeqOptimized.scala:140)
  scala.collection.mutable.ArrayOps$ofChar.drop(ArrayOps.scala:227)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:233)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:226)
  scala.reflect.api.Trees$Transformer.$anonfun$transformTrees$1(Trees.scala:2559)
  scala.reflect.api.Trees$Transformer.transformTrees(Trees.scala:2559)
  scala.reflect.internal.Trees.itransform(Trees.scala:1358)
  scala.reflect.internal.Trees.itransform$(Trees.scala:1347)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:228)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:226)
  scala.reflect.internal.Trees.itransform(Trees.scala:1356)
  scala.reflect.internal.Trees.itransform$(Trees.scala:1347)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:228)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:226)
  scala.reflect.internal.Trees.itransform(Trees.scala:1358)
  scala.reflect.internal.Trees.itransform$(Trees.scala:1347)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
  scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
  ammonite.interp.LineNumberModifier$LineNumberCorrector$2$.transform(AmmonitePlugin.scala:228)

I've tried giving the following

Running as jar:

java -Xms2g -Xmx2g -jar amm buildDatabase.sc

Altering JAVA_OPTS:

export SBT_OPTS="-Xmx2g -Xms2g"  

Altering SBT_OPTS:

export SBT_OPTS="-Xmx2g -Xms2g"              

...but nothing seems to work. This compiles(and runs!) using Intellij, with 512m of heap memory.

Note that because this file needs to be regenerated every time the script is run, I've separated the main file into three compilation blocks. I'm not sure if this has any relevance to my problem.

//Add 3rd party repo
import coursier.MavenRepository
interp.repositories() ++= Seq(MavenRepository("https://maven.alfresco.com/nexus/content/groups/public"))

@ //recompile

import $file.RefreshTables, RefreshTables.refreshTableDefinitions
refreshTableDefinitions()

@ //recompile

import $file.Constants, Constants._
import $file.Utils, Utils.startContainerAndCreateDatabase
import $file.CreateTables, CreateTables.createTables

startContainerAndCreateDatabase(DATABASE_NAME)
createTables()

println("done?")

Please help! Thank you. :)

Raudbjorn
  • 450
  • 2
  • 8
  • I have a hunch: the end of one of the scripts, the resulting value is a big and complex data structure. Have you seen how much work Ammonite does to print a simple structure - like let's say a few nested case class? – pedrofurla Sep 18 '17 at 17:53
  • Amending the above: perhaps it's not in the end, don't recall if ammonite tries to print every single step. – pedrofurla Sep 18 '17 at 17:54
  • it looks like an infinite loop – david.perez Jan 15 '19 at 11:19

0 Answers0