Будет ли команда оболочки присоединиться к причине нехватки памяти?

233
Hancy

У меня есть два файла, чтобы присоединиться.

ФАЙЛ 1:

a A1 a A2 a A3 ... c C1 c C2 ... 

ФАЙЛ 2:

a feature1_of_a a feature2_of_a ... a featureN_of_a ... ... c feature1_of_c c feature2_of_c ... 

после присоединения я мог получить Файл как это:

A1 feature1_of_a A2 feature1_of_a A3 feature1_of_a A1 feature2_of_a A2 feature2_of_a A3 feature2_of_a ... A1 featureN_of_a A2 featureN_of_a A3 featureN_of_a ... 

Чтобы сделать это: я написал команду оболочки join -11 -21 -o1.2,2.2 file1 file2. Но проблема в том, что число N может быть огромным. Таким образом, если объединение прочитает все свойства a в памяти, памяти может не хватить.

Я не знаю, как реализовано соединение. Может ли Момери стать проблемой? Если так, есть ли способ получить то, что я хочу?

-1

1 ответ на вопрос

1
Jonathan Leffler

How huge do you think N might be?

Unless it is in the 'many millions' range, or you are working in an unusually tightly constrained (memory poor) environment, you are not going to run out of memory.

Я попробовал на своем компьютере с памятью 1G вот так: сделайте 10 строк в file1, все первые столбцы - «a». Затем я установил file2 N = 2 000 000, размер file2 равен 500M, и все первые столбцы file2 тоже 'a'. Но затем я запускаю команду "join -11 -21 -o1.2,2.2 file1 file2", она вылетает. Вы знаете, почему это произошло? Hancy 11 лет назад 0
Недостаточно памяти, потому что вы не очень разумны в своем запросе. Вы делаете декартово произведение строк в файле1 и строк в файле2. Я немного удивлен, что не смог вместить все 500 МБ в основной памяти. Я не знаю, имеет ли это какое-то значение, если вы переупорядочиваете file1 и file2 в командной строке (стоит попробовать, потому что это легко), но я не удивлюсь, обнаружив, что это не имеет значения. Вы на 32-битной машине или на 64-битной? Более важно, является ли исполняемый файл `join` 32-битным или 64-битным? Вы уверены, что вывод полезен? Jonathan Leffler 11 лет назад 0

Похожие вопросы