# Copyright 2020 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ """Writes events to disk in a logdir.""" import os import time import stat from mindspore import log as logger from ..._c_expression import EventWriter_ from ._summary_adapter import package_init_event class _WrapEventWriter(EventWriter_): """ Wrap the c++ EventWriter object. Args: full_file_name (str): Include directory and file name. """ def __init__(self, full_file_name): if full_file_name is not None: EventWriter_.__init__(self, full_file_name) class EventRecord: """ Creates a `EventFileWriter` and write event to file. Args: full_file_name (str): Summary event file path and file name. flush_time (int): The flush seconds to flush the pending events to disk. Default: 120. """ def __init__(self, full_file_name: str, flush_time: int = 120): self.full_file_name = full_file_name # The first event will be flushed immediately. self.flush_time = flush_time self.next_flush_time = 0 # create event write object self.event_writer = self._create_event_file() self._init_event_file() # count the events self.event_count = 0 def _create_event_file(self): """Create the event write file.""" with open(self.full_file_name, 'w'): os.chmod(self.full_file_name, stat.S_IWUSR | stat.S_IRUSR) # create c++ event write object event_writer = _WrapEventWriter(self.full_file_name) return event_writer def _init_event_file(self): """Send the init event to file.""" self.event_writer.Write((package_init_event()).SerializeToString()) self.flush() return True def write_event_to_file(self, event_str): """Write the event to file.""" self.event_writer.Write(event_str) def get_data_count(self): """Return the event count.""" return self.event_count def flush_cycle(self): """Flush file by timer.""" self.event_count = self.event_count + 1 # Flush the event writer every so often. now = int(time.time()) if now > self.next_flush_time: self.flush() # update the flush time self.next_flush_time = now + self.flush_time def count_event(self): """Count event.""" logger.debug("Write the event count is %r", self.event_count) self.event_count = self.event_count + 1 return self.event_count def flush(self): """Flush the event file to disk.""" self.event_writer.Flush() def close(self): """Flush the event file to disk and close the file.""" self.flush() self.event_writer.Shut()