aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2021-11-03 09:54:02 +0000
committerFederico Igne <federico.igne@cs.ox.ac.uk>2021-11-03 09:54:02 +0000
commit47a89f67f4acdbd55fd1cbfb704211937962e522 (patch)
tree53642651d35f8fffa2db69c3c3d80558e811879c
parentd5d60c5a2ec20896a824ba71a11c0e8c2d78a5ca (diff)
downloadRSAComb-47a89f67f4acdbd55fd1cbfb704211937962e522.tar.gz
RSAComb-47a89f67f4acdbd55fd1cbfb704211937962e522.zip
Avoid generating a JSON string before writing to file
This solve a crash when considering a huge amount of queries.
-rw-r--r--project/Dependencies.scala2
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala11
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/RSAConfig.scala2
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/util/Logger.scala45
4 files changed, 41 insertions, 19 deletions
diff --git a/project/Dependencies.scala b/project/Dependencies.scala
index 336f052..8341b8d 100644
--- a/project/Dependencies.scala
+++ b/project/Dependencies.scala
@@ -5,7 +5,7 @@ object Dependencies {
5 lazy val scalatestVersion = "3.2.3" 5 lazy val scalatestVersion = "3.2.3"
6 lazy val owlapiVersion = "5.1.17" 6 lazy val owlapiVersion = "5.1.17"
7 lazy val scalagraphVersion = "1.13.2" 7 lazy val scalagraphVersion = "1.13.2"
8 lazy val ujsonVersion = "1.4.1" 8 lazy val ujsonVersion = "1.4.2"
9 lazy val oslibVersion = "0.7.8" 9 lazy val oslibVersion = "0.7.8"
10 10
11 // Libraries 11 // Libraries
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala
index 7eb39e8..fe88b4f 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala
@@ -41,6 +41,10 @@ object RSAComb extends App {
41 if (config.contains('logger)) 41 if (config.contains('logger))
42 Logger.level = config('logger).get[Logger.Level] 42 Logger.level = config('logger).get[Logger.Level]
43 43
44 /* Set answers output file */
45 if (config.contains('answers))
46 Logger.answers = config('answers).get[os.Path]
47
44 /* Load original ontology and normalize it */ 48 /* Load original ontology and normalize it */
45 val ontopath = config('ontology).get[os.Path] 49 val ontopath = config('ontology).get[os.Path]
46 val data = config('data).get[List[os.Path]] 50 val data = config('data).get[List[os.Path]]
@@ -61,12 +65,7 @@ object RSAComb extends App {
61 val answers = rsa ask queries 65 val answers = rsa ask queries
62 66
63 /* Write answers to output file */ 67 /* Write answers to output file */
64 os.write( 68 Logger write answers
65 config('answers).get[os.Path],
66 ujson.write(ujson.Arr(answers.map(_.toJSON)), indent = 2),
67 createFolders = true
68 )
69
70 /* Generate simulation script */ 69 /* Generate simulation script */
71 Logger.generateSimulationScripts(data, queries) 70 Logger.generateSimulationScripts(data, queries)
72 } 71 }
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAConfig.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAConfig.scala
index f3039b3..4d96850 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAConfig.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAConfig.scala
@@ -149,8 +149,6 @@ object RSAConfig {
149 exit("The following flag is mandatory: '-o' or '--ontology'.") 149 exit("The following flag is mandatory: '-o' or '--ontology'.")
150 if (!config.contains('data)) 150 if (!config.contains('data))
151 config += ('data -> List.empty[os.Path]) 151 config += ('data -> List.empty[os.Path])
152 if (!config.contains('answers))
153 config += ('answers -> Logger.dir / "answers.json")
154 config 152 config
155 } 153 }
156} 154}
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/util/Logger.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/util/Logger.scala
index f3b0232..20fd4c3 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/util/Logger.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/util/Logger.scala
@@ -19,23 +19,25 @@ package uk.ac.ox.cs.rsacomb.util
19import java.util.Calendar 19import java.util.Calendar
20import java.text.SimpleDateFormat 20import java.text.SimpleDateFormat
21import java.io.PrintStream 21import java.io.PrintStream
22import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery 22import uk.ac.ox.cs.rsacomb.sparql.{ConjunctiveQuery, ConjunctiveQueryAnswers}
23 23
24/** Simple logger */ 24/** Simple logger */
25object Logger { 25object Logger {
26 26
27 lazy val dir = { 27 /** Main directory for logger output for the current run */
28 val dir = {
28 val timestamp = (new SimpleDateFormat("yyyyMMddHHmmss")).format( 29 val timestamp = (new SimpleDateFormat("yyyyMMddHHmmss")).format(
29 Calendar.getInstance().getTime 30 Calendar.getInstance().getTime
30 ) 31 )
31 val dir = os.pwd / s"rsacomb-$timestamp" 32 os.pwd / s"rsacomb-$timestamp"
32 os.makeDir(dir)
33 dir
34 } 33 }
35 34
36 /** Output stream for the logger. */ 35 /** Output stream for the logger. */
37 var output: PrintStream = System.out 36 var output: PrintStream = System.out
38 37
38 /** Path to answers output file */
39 var answers: os.Path = dir / "answers.json"
40
39 /** Logger levels (i.e., verbosity of output) */ 41 /** Logger levels (i.e., verbosity of output) */
40 sealed abstract class Level(val level: Int, val name: String) 42 sealed abstract class Level(val level: Int, val name: String)
41 extends Ordered[Level] { 43 extends Ordered[Level] {
@@ -67,8 +69,29 @@ object Logger {
67 */ 69 */
68 def write(content: => os.Source, file: String, lvl: Level = VERBOSE): Unit = 70 def write(content: => os.Source, file: String, lvl: Level = VERBOSE): Unit =
69 if (lvl <= level) 71 if (lvl <= level)
70 os.write.append(dir / file, content) 72 os.write.append(dir / file, content, createFolders = true)
73
74 /** Write answers to queries to output file in JSON format.
75 *
76 * @param ans the set of answers to be written.
77 */
78 def write(ans: Seq[ConjunctiveQueryAnswers]): Unit = {
79 ujson.writeToOutputStream(
80 ujson.Arr(ans.map(_.toJSON)),
81 os.write.outputStream(answers, createFolders = true),
82 indent = 2
83 )
84 }
71 85
86 /** Timed evaluation of an expression.
87 *
88 * Records and outputs additional information about evaluation time.
89 *
90 * @param expr expression to be evaluated.
91 * @param desc short description of the expression.
92 * @param lvl minimum require logger level for output
93 * @return the result of the evaluation.
94 */
72 def timed[A](expr: => A, desc: String = "", lvl: Level = NORMAL): A = { 95 def timed[A](expr: => A, desc: String = "", lvl: Level = NORMAL): A = {
73 val t0 = System.currentTimeMillis() 96 val t0 = System.currentTimeMillis()
74 print(s"$desc (START)", lvl) 97 print(s"$desc (START)", lvl)
@@ -92,7 +115,6 @@ object Logger {
92 if (lvl <= level) { 115 if (lvl <= level) {
93 /* Create script folder */ 116 /* Create script folder */
94 val sim = os.rel / 'sim 117 val sim = os.rel / 'sim
95 os.makeDir(dir / sim)
96 /* Generate main script */ 118 /* Generate main script */
97 os.write.append( 119 os.write.append(
98 dir / "simulate.rdfox", 120 dir / "simulate.rdfox",
@@ -121,14 +143,16 @@ echo "\\n[Load canonical model program]"
121import "canonical_model.dlog" 143import "canonical_model.dlog"
122 144
123exec "$sim/filter_query_$$(1).rdfox" 145exec "$sim/filter_query_$$(1).rdfox"
124""" 146""",
147 createFolders = true
125 ) 148 )
126 /* Generate query scripts */ 149 /* Generate query scripts */
127 queries.map(q => { 150 queries.map(q => {
128 val id = q.id 151 val id = q.id
129 os.write.append( 152 os.write.append(
130 dir / sim / "filter_query_all.rdfox", 153 dir / sim / "filter_query_all.rdfox",
131 s"exec $sim/filter_query_$id.rdfox\n" 154 s"exec $sim/filter_query_$id.rdfox\n",
155 createFolders = true
132 ) 156 )
133 os.write.append( 157 os.write.append(
134 dir / sim / s"filter_query_$id.rdfox", 158 dir / sim / s"filter_query_$id.rdfox",
@@ -136,7 +160,8 @@ exec "$sim/filter_query_$$(1).rdfox"
136echo "\\n[Load filtering program for query $id]" 160echo "\\n[Load filtering program for query $id]"
137tupletable create rsacomb:Filter$id type "named-graph" 161tupletable create rsacomb:Filter$id type "named-graph"
138import "filter_query_$id.dlog" 162import "filter_query_$id.dlog"
139""" 163""",
164 createFolders = true
140 ) 165 )
141 }) 166 })
142 } 167 }