Convertir script ruby en Go
Bonjour à tous,
Suite à mes difficultés avec le split de gros fichiers XML, j'ai fini par trouver et adapter un script Ruby
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| require 'xml'
XML_FILE = './exported_0.xml'
# A special file class that we'll write its output in
# successive files with the same number of items in it
# (except for the last one which size may vary)
class SplitFile
def initialize(template_name, items_per_file)
@template_name = template_name
@items_per_file = items_per_file
@item_count = 0
@file_index = 0
@fh = open()
end
def write(content)
@fh.write(content)
@fh.write("\n")
@item_count += 1
if @item_count == @items_per_file
self.close()
self.open()
end
end
def open
exit if @file_index == 3
@file_index += 1
@fh = File.open(self.batch_name(), 'w')
end
def close
@fh.close
@item_count = 0
end
def batch_name
@template_name % @file_index
end
end
# XML Processor to split the Product records into
# smaller XML chunks
class XMLSplitProcessor
def initialize(xml_sourcefile, split_filename_template)
@split_filename_template = split_filename_template
@file_handle = SplitFile.new(split_filename_template, 1000)
@reader = XML::Reader.file(xml_sourcefile)
end
def run
while @reader.read do
self.process_node()
end
end
def process_node
if @reader.name == 'Product' && reader.node_type == XML::Reader::TYPE_ELEMENT
@file_handle.write(@reader.read_outer_xml)
@reader.next
end
end
end
# Main
XMLSplitProcessor.new(XML_FILE, "batch_%s.xml").run |
Il tourne en 15min pour un fichier de 20Go.
A l'avenir je vais avoir des fichiers de l'ordre de 150Go, et je voudrais prendre les devant en optimisant ces 15min.
C'est pourquoi je me tourne vers le langage Go qui semble à propos.
Mais je ne connais rien du tout. Du coup je tente de me dépatouiller avec ça, mais il n'y a encore fort peu de doc sur le Go, surtout traitant du XML.
Si jamais vous avez des idées je suis preneur.
Merci