Может ли чтение списка с диска быть лучше, чем загрузка словаря? - PullRequest
2 голосов
/ 22 мая 2009

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

newsDict('identifier','MM/DD/YYYY')=[list of news events for that date]

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

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

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

[('identifier','MM/DD/YYYY'),[list of news events for that date]]

Тогда я подумал, что у меня будет словарь, в котором будет указан диапазон списка для каждого идентификатора компании

 companyDict['identifier']=(begofRangeinListforComp,endofRangeinListforComp)

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

Самая большая причина, которую я вижу для этого, состоит в том, что даже если словарь разбит на три трети, каждая секция загружается на моем компьютере около двух минут, а словарь в итоге занимает около 600–750 МБ ОЗУ.

Я с удивлением заметил, что для загрузки списка из восьми миллионов строк потребовалось всего около 15 секунд, и он занимал около 1/3 памяти словаря, в которой было 1/3 записей.

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

Я удивлен, так как думал, что словарь будет наиболее эффективным способом сделать это. но мой взгляд на это предполагает, что словарь требует значительно больше памяти, чем список. Мое прочтение других постов в SO и других местах предполагает, что любая другая структура потребует выделения указателей, которые стоят дороже, чем указатели списков. Я что-то здесь упускаю и есть ли лучший способ сделать это?

Прочитав ответ Альберто и ответ на мой комментарий, я потратил некоторое время, пытаясь выяснить, как написать функцию, если бы мне пришлось использовать БД. Теперь я могу быть замкнут, потому что я не знаю много о программировании БД, но

Я думаю, что код для реализации с использованием БД будет намного сложнее, чем:

outList=[]
massiveFile=open('theFile','r')
for identifier in sortedUserList
# I get the list and sort it by the key of the dictionary 
    identifierList=massiveFile[theDict[identifier]['beginPosit']:theDict[identifier]['endPosit']+1]
    for item in identifierList:
        if item.startswith(manipulation of the identifier)
        outList.append(item)

Я должен обернуть это в функцию, которую я не видел, что было бы так же просто, если бы я преобразовал список в дб.

Конечно проще не было причины приводить меня на этот форум. Я до сих пор не вижу, что использование другой структуры будет стоить меньше памяти. У меня есть 30000 идентификаторов компаний и приблизительно 3600 дат. Каждый элемент в моем списке является объектом на языке OOD. Вот где я борюсь, сегодня утром я потратил шесть часов на подготовку данных для словаря, прежде чем сдаться. Потратив такое количество времени на реализацию базы данных, а затем обнаружив, что я использую половину гигабайта или больше чужой памяти для загрузки, это кажется проблематичным

Ответы [ 2 ]

5 голосов
/ 22 мая 2009

При таком большом количестве данных вы должны использовать базу данных. Это было бы намного лучше, чем просмотр списка, и в любом случае было бы наиболее подходящим способом хранения ваших данных. Если вы используете Python, в него встроен SQLite.

1 голос
/ 22 мая 2009

Словарь займет больше памяти, потому что он фактически является хешем.

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

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

Например, новости IBM за 21 мая были бы в C: \ db \ IBM \ 20090521 \ news.txt, если бы на самом деле были новости за этот день. Вы просто проверяете, существует ли файл; нет поисков.

Если вы хотите оттуда повысить скорость, придумайте схему для кеширования ограниченного количества результатов, которые, вероятно, будут часто запрашиваться (при условии, что вы работаете на сервере). Для этого вы бы использовали хеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...