Как сохранить данные из файла, но не в переменной или списке в Python?

1

Мне нужно прочитать файл размером около 5 Гбайт и написать скрипт в Python, который сделал бы это:

cat file | awk -F '","'  '{if ($12 !="" ) print  $9,$10,$12}'| sort -n | uniq -c | sort -nr | head -100

9,10,12 - параметры, которые я хочу получить из этого файла.

Я могу сделать это в Bash без проблем, а в скриптах Python с os.system и этой командой... Но мне нужно написать скрипт Python правильно.

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

Я думал писать данные в файл вместо списка, но я не нашел способ сделать это.

  • 0
    Если вы не можете использовать много памяти, используйте промежуточные файлы. Это займет больше времени, но это будет работать. Почему вы не достигли способ сделать это? В чем проблема? Покажите нам код, который вы пробовали, чтобы мы могли точно определить проблемы.
Теги:

3 ответа

1

Вы можете использовать хотя бы переменную счетчика python

Это может оптимизировать хранение триплетов и количество раз, когда они появляются.

Псевдо скрипт:

for line in file.readlines():
    data = line.strip().split(',')
    x = data[colums_that_you_want]
    xtoken = '_'.join(x)
    counter[xtoken] += 1


counter.most_common(100)
0

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

оригинал:

$ cat file | awk -F '","'  '{if ($12 !="" ) print  $9,$10,$12}'| sort -n | uniq -c | sort -nr | head -100

1. удалить cat :

Едва ли нужна команда cat.

$ awk -F '","' '{if ($12 !="" ) print  $9,$10,$12}' file | sort -n | uniq -c | sort -nr | head -100

2. улучшить awk :

$ awk -F '","' '($12 !="" ){print $9,$10,$12}' file | sort -n | uniq -c | sort -nr | head -100

3. устранить sort -n | uniq -c sort -n | uniq -c : вы можете избавиться от этих двух, снова используя awk. Вы храните все в массиве, но это, по сути, то, что sort и uniq тоже.

$ awk -F '","' '($12 !="" ){a[$9 OFS $10 OFS $12]++}
                END{for(i in a) print a[i],i}' file | sort -nr | head -100

4. PROCINFO последние две трубы: с помощью GNU awk вы можете отсортировать массив с помощью PROCINFO

$ awk -F '","' 'BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"}
                ($12 !="" ){a[$9 OFS $10 OFS $12]++}
                END{for(i in a) {j++; print a[i],i; if (j==100) exit} }' file
0

Я не уверен, что это то, что вы ищете, но, возможно, это может помочь, если вы объедините это с разделом текста, предложенным другими пользователями.

Вы можете сохранить свои данные в файле.txt следующим образом:

file = open("path/file.txt", "w") # This will create the file.
write = file.write(text_variable) # This will write the content of text_variable into your file.txt
file.close()

Существует и другой способ использования JSON:

import json
text = json.dumps(text_variable) # This will store the content of text_variable in a json format.
file = open("path/file.json", "w") # This will create the json file.
write = file.write(text) # This will write the content of text into your file.json
file.close()

Затем, если вы хотите получить данные своего JSON, просто выполните следующее:

import json
file = open("path/file.json", "r") # This will open the json file in read mode.
jsontext = file.read()
text = json.loads(jsontext) # You will have in text the original data you had at the beginning.

Я надеюсь, что это помогает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню