если программа поддерживает потоковый ввод-вывод, она может работать с файлами больше, чем размер памяти, правильно ли это
Обычно да, но не обязательно. Представьте себе программу, подобную uniq
, но более сложную, которая подсчитывает количество вхождений каждой уникальной строки, полученной на вход. В отличие от uniq
, она выводит текущий итог количества вхождений, замеченных на данный момент. Поэтому он считается потоковым, так как производит вывод по мере поступления входных данных. Но если каждая строка входных данных уникальна или близка к этому, ей придется запоминать каждую отдельную строку в структуре данных, чтобы поддерживать бегущий подсчет, и она фактически не сможет обрабатывать файл, который больше памяти.
Также есть ли способ узнать, какие программы поддерживают потоковый ввод/вывод?
Нет, если это не задокументировано или если вы не можете проверить это сами, нет, потому что это зависит от того, что делает программа.
Однако вы можете сделать нечто близкое: вы можете проверить, нужен ли программе входной файл с возможностью поиска. Некоторые программы принимают на вход либо трубку, либо обычный файл (или сокет, или что-то еще). Другие могут принимать только обычный файл. Если программа настаивает на обычном файле с возможностью поиска, то велика вероятность того, что она не делает никаких потоков. Если она позволяет использовать в качестве входных данных трубу, то велика вероятность, что она это делает. Но есть и исключения. Например, sort
позволяет использовать трубу в качестве входа, но он не выполняет потоковую передачу: он выводит только то, что находится после конца входного файла.