Когда лучше загружать все данные из файла при инициализации, а не выполнять поиск файлов по требованию? (Джава) - PullRequest
0 голосов
/ 10 мая 2018

Я часто сталкиваюсь с задачей разбора данных, хранящихся в файлах в локальной системе.Существенной дилеммой является то, загружать и анализировать ли все данные файла в начале выполнения программы, или обращаться к файлу на протяжении всего выполнения и читать данные по требованию (при условии, что файл отсортирован, поэтому поиск выполняется в постоянное время),

Когда речь идет о небольших наборах данных, первый подход кажется выгодным, но с более крупными угроза засорения кучи возрастает.

Какие общие рекомендации можно использовать в таких сценариях?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Это полностью зависит от того, что ваша программа должна делать.Общий совет - хранить в памяти столько данных, сколько необходимо.Например, рассмотрим простую программу, которая считывает каждую запись из файла транзакций, а затем сообщает об общем количестве транзакций и общей сумме в долларах:

count = 0
dollars = 0
while not end of file
    read record
    parse record
    increment count
    add transaction amount to dollars
end
output count and dollars

Здесь вам явно необходима только одна транзакциязапись в память за один раз.Итак, вы читаете запись, обрабатываете ее и отбрасываете.Нет смысла загружать все записи в список или другую структуру данных, а затем выполнять итерацию по списку, чтобы получить счетчик и общую сумму в долларах.

В некоторых случаях вам нужно несколько записей, возможно, всеиз них в памяти.В этих случаях все, что вам нужно сделать, это немного перестроить программу.Вы продолжаете цикл чтения, но позволяете ему добавлять записи в список.Затем вы можете обработать список:

list = []
while not end of file
    read record
    parse record
    add record to list
end
process list
output results

Нет смысла загружать весь файл в список, а затем последовательно сканировать список, чтобы получить количество и количество в долларах.Это не только пустая трата памяти, но и более сложная программа, использование памяти без выигрыша, медленная работа и сбой при работе с большими наборами данных.Соотношение «память и производительность» не всегда применимо.Часто, как и в этом случае, использование большего объема памяти замедляет работу программы.

Обычно я считаю хорошей практикой структурировать свои решения таким образом, чтобы хранить в памяти как можно меньше данных.Например, если решение будет проще с сортированными данными, я позабочусь о том, чтобы входные данные были отсортированы до запуска программы.

Это общий совет.Без конкретных примеров трудно сказать, какой подход предпочтительнее.

0 голосов
/ 10 мая 2018

Это стандартный компромисс в программировании - память по сравнению с производительностью, компромисс между пространством и временем и т. Д. На этот вопрос нет «правильного» ответа. Это зависит от объема вашей памяти, скорости, которая вам нужна, размера файлов, частоты запросов и т. Д.

В вашем конкретном случае, и поскольку это похоже на разовую работу (если вы можете прочитать ее в начале), то, вероятно, это не будет иметь большого значения;)

...