У меня есть некоторая обработка с использованием стороннего API, и я планировал использовать CSV-файл в качестве невыполненной работы.
Пример
Task to do Resulting file
#1 data/1.json
#2 data/2.json
#3
Итак, # 1 и # 2 уже сделаны. Я хочу работать над # 3 и сохранить файл CSV, как только data/3.json
будет завершено.
Поскольку задача нестабильна и подвержена ошибкам, я хочу сохранить прогресс после каждой задачи в файле CSV.
Я написал этот сценарий на Ruby, он работает хорошо, но поскольку задач много (> 100 КБ), он записывает пару мегабайт на диск при каждой обработке задачи. Все это. Кажется, хороший способ убить мой HD:
class CSVResolver
require 'csv'
attr_accessor :csv_path
def initialize csv_path:
self.csv_path = csv_path
end
def resolve
csv = CSV.read(csv_path)
csv.each_with_index do |row, index|
next if row[1] # Don't do anything if we've already processed this task, and got a JSON data
json = very_expensive_task_and_error_prone
row[1] = "/data/#{index}.json"
File.write row[1], JSON.pretty_generate(json)
csv[index] = row
CSV.open(csv_path, "wb") do |old_csv|
csv.each do |row|
old_csv << row
end
end
resolve
end
end
end
Есть ли способ улучшить это, например, сделать запись в CSV-файл атомарным?