Я создаю приложение, в котором я пытаюсь разрешить пользователям отправлять список пар компаний и дат и выяснять, произошло ли новостное событие в эту дату. Новостные события хранятся в словаре с идентификатором компании и датой в качестве ключа.
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. Вот где я борюсь, сегодня утром я потратил шесть часов на подготовку данных для словаря, прежде чем сдаться. Потратив такое количество времени на реализацию базы данных, а затем обнаружив, что я использую половину гигабайта или больше чужой памяти для загрузки, это кажется проблематичным