diff options
author | Federico Igne <federico.igne@cs.ox.ac.uk> | 2021-11-03 09:54:02 +0000 |
---|---|---|
committer | Federico Igne <federico.igne@cs.ox.ac.uk> | 2021-11-03 09:54:02 +0000 |
commit | 47a89f67f4acdbd55fd1cbfb704211937962e522 (patch) | |
tree | 53642651d35f8fffa2db69c3c3d80558e811879c | |
parent | d5d60c5a2ec20896a824ba71a11c0e8c2d78a5ca (diff) | |
download | RSAComb-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.scala | 2 | ||||
-rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala | 11 | ||||
-rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/RSAConfig.scala | 2 | ||||
-rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/util/Logger.scala | 45 |
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 | |||
19 | import java.util.Calendar | 19 | import java.util.Calendar |
20 | import java.text.SimpleDateFormat | 20 | import java.text.SimpleDateFormat |
21 | import java.io.PrintStream | 21 | import java.io.PrintStream |
22 | import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery | 22 | import uk.ac.ox.cs.rsacomb.sparql.{ConjunctiveQuery, ConjunctiveQueryAnswers} |
23 | 23 | ||
24 | /** Simple logger */ | 24 | /** Simple logger */ |
25 | object Logger { | 25 | object 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]" | |||
121 | import "canonical_model.dlog" | 143 | import "canonical_model.dlog" |
122 | 144 | ||
123 | exec "$sim/filter_query_$$(1).rdfox" | 145 | exec "$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" | |||
136 | echo "\\n[Load filtering program for query $id]" | 160 | echo "\\n[Load filtering program for query $id]" |
137 | tupletable create rsacomb:Filter$id type "named-graph" | 161 | tupletable create rsacomb:Filter$id type "named-graph" |
138 | import "filter_query_$id.dlog" | 162 | import "filter_query_$id.dlog" |
139 | """ | 163 | """, |
164 | createFolders = true | ||
140 | ) | 165 | ) |
141 | }) | 166 | }) |
142 | } | 167 | } |