У меня есть имя файла в следующем формате:
отметка времени-пользователя-1
Этот файл постоянно записывается, но до того, как он станет слишком большим, я хочу создать новый файл.
отметка времени-пользователя-2
Как я могу добиться этого с использованием наименьшего количества памяти (то есть без переменных или с небольшими переменными)
вот моя версия:
private void Split() {
char[] strArr = FlowArgs.Filename.ToCharArray();
int num;
//get the last number
if (Int32.TryParse(strArr[strArr.Length - 1].ToString(), out num)) {
num += 1;
}
//replace the old number with the new number
char.TryParse(num.ToString(), out strArr[strArr.Length - 1]);
FlowArgs.Filename = strArr.ToString();
}
Редактировать: Я добавил свойство «версия» (int) в класс FlowArgs. Однако моя новая проблема заключается в том, как я могу добавить это в конец имени файла





«наименьшее количество памяти» НЕ равно «отсутствие или мало переменных»
Локальные переменные занимают мало памяти. Но создание объекта в куче занимает намного больше времени, и для очистки требуется сборщик мусора.
В вашем примере ваши ToCharArray () и ToString () создали 4 объекта (косвенно созданный объект не включен).
Что бы вы посоветовали тогда? FlowArgs - это класс, унаследованный от EventArgs. Думаю, я мог бы просто добавить еще одно свойство под названием «версия» и увеличить его?
Я думаю, вам следует просто сохранить счетчик в int. Я понимаю, что вы хотите сэкономить место в памяти, но, честно говоря, дополнительный int действительно находится в категории "приемлемых". Я имею в виду, что парсер Int32, вероятно, тратит намного больше памяти. Не забывайте, что на x86 пространство памяти разделено на 4096 байтовых страниц, поэтому тратится гораздо больше памяти, чем эти 4 байта.
РЕДАКТИРОВАТЬ: вы, вероятно, захотите иметь в своем классе такой метод, как GetNextFileName (), который генерирует вам следующее имя файла (возможность рефакторинга вашего кода на небольшие биты важна, гораздо важнее, чем экономия места в памяти):
private int nextFileNumber = 0;
private string GetNextFileName(string userName)
{
return String.Format("{0}-{1}-{2}", DateTime.Now, userName,
nextFileNumber++);
}
ваша строковая переменная уже является массивом символов:
int num=0;
//get the last number
if (Int32.TryParse(FolwArgs.Filename[FolwArgs.Filename.Length-1].ToString(), out num))
num++;
//replace the old number with the new number
char.TryParse(num.ToString(), out FolwArgs.Filename[FolwArgs.Filename.Length-1]]);
Вместо использования текущего счетчика рассмотрите возможность использования datetime of creation в качестве изменяющейся части вашего имени файла. Таким образом, вам не нужно сохранять и извлекать предыдущее значение.
Используя метод ToBinary(), вы можете получить числовое представление времени.
Конечно, можно использовать любой допустимый формат времени в имени файла - см. строки настраиваемого формата даты и времени.
Преждевременная оптимизация - корень всех зол