purplelight 0.1.18 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,6 +47,7 @@ PARQUET_READ_DOCS = Array.new(10_000) do |index|
47
47
  'score' => index * 0.25,
48
48
  'nullable_score' => (nullable ? nil : index * 0.5),
49
49
  'category' => "category-#{index % 8}",
50
+ 'symbol' => :"symbol-#{index % 8}",
50
51
  'unique_text' => format('row-%<index>08d-value-%<encoded>08x',
51
52
  index:, encoded: index * 2_654_435_761),
52
53
  'utf8_text' => "日本語-#{index % 32}",
@@ -43,8 +43,13 @@ module Purplelight
43
43
  end
44
44
  end
45
45
 
46
- def close
46
+ def close(discard: false)
47
47
  @mutex.synchronize do
48
+ if discard
49
+ @queue.clear
50
+ @sizes.clear
51
+ @bytes = 0
52
+ end
48
53
  @closed = true
49
54
  @cv.broadcast
50
55
  end
@@ -131,6 +131,12 @@ module Purplelight
131
131
 
132
132
  # Reader queue
133
133
  queue = ByteQueue.new(max_bytes: @queue_size_bytes)
134
+ failure_mutex = Mutex.new
135
+ worker_failure = nil
136
+ record_failure = lambda do |error|
137
+ failure_mutex.synchronize { worker_failure ||= error }
138
+ queue.close(discard: true)
139
+ end
134
140
 
135
141
  # Writer
136
142
  writer_count = @format == :jsonl ? [@writer_threads.to_i, 1].max : 1
@@ -163,9 +169,15 @@ module Purplelight
163
169
  readers = partition_filters.each_with_index.map do |pf, idx|
164
170
  Thread.new do
165
171
  local_telemetry = @telemetry_enabled ? Telemetry.new(enabled: true) : Telemetry::NULL
166
- read_partition(idx: idx, filter_spec: pf, queue: queue, batch_size: @batch_size, manifest: manifest, telemetry: local_telemetry)
167
- # Merge per-thread telemetry
168
- @telemetry.merge!(local_telemetry) if @telemetry_enabled
172
+ begin
173
+ read_partition(idx: idx, filter_spec: pf, queue: queue, batch_size: @batch_size,
174
+ manifest: manifest, telemetry: local_telemetry)
175
+ rescue StandardError => e
176
+ record_failure.call(e)
177
+ ensure
178
+ # Merge per-thread telemetry
179
+ @telemetry.merge!(local_telemetry) if @telemetry_enabled
180
+ end
169
181
  end
170
182
  end
171
183
 
@@ -182,8 +194,14 @@ module Purplelight
182
194
 
183
195
  worker_writer.write_many(batch)
184
196
  end
197
+ rescue StandardError => e
198
+ record_failure.call(e)
185
199
  ensure
186
- worker_writer.close
200
+ begin
201
+ worker_writer.close
202
+ rescue StandardError => e
203
+ record_failure.call(e)
204
+ end
187
205
  end
188
206
  end
189
207
 
@@ -212,6 +230,9 @@ module Purplelight
212
230
  else
213
231
  @running = false
214
232
  end
233
+ worker_error = failure_mutex.synchronize { worker_failure }
234
+ raise worker_error if worker_error
235
+
215
236
  if @telemetry_enabled
216
237
  total = @telemetry.timers.values.sum
217
238
  breakdown = @telemetry.timers
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Purplelight
4
- VERSION = '0.1.18'
4
+ VERSION = '0.1.19'
5
5
  end
@@ -118,7 +118,7 @@ module Purplelight
118
118
  return build_string_array(values)
119
119
  end
120
120
  return build_string_array(values) if data_type.is_a?(Arrow::StringDataType) ||
121
- first.is_a?(String) || first.is_a?(Hash)
121
+ first.is_a?(String) || first.is_a?(Symbol) || first.is_a?(Hash)
122
122
  if (data_type.is_a?(Arrow::ListDataType) || first.is_a?(Array)) &&
123
123
  values.all? { |value| value.nil? || value.is_a?(Array) } &&
124
124
  (data_type || values.any? { |value| value && !value.empty? })
@@ -317,13 +317,14 @@ module Purplelight
317
317
 
318
318
  def low_cardinality_strings?(values)
319
319
  first = values.find { |value| !value.nil? }
320
- return false unless first.is_a?(String)
320
+ string_like = first.is_a?(String) || first.is_a?(Symbol)
321
+ return false unless string_like
321
322
 
322
323
  distinct = {}
323
324
  count = 0
324
325
  values.each do |value|
325
326
  next if value.nil?
326
- return false unless value.is_a?(String)
327
+ return false unless value.is_a?(String) || value.is_a?(Symbol)
327
328
 
328
329
  count += 1
329
330
  distinct[value] = true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: purplelight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Nicholson