Как эффективно читать и хранить данные из 1 ГБ текстового файла? - PullRequest
0 голосов
/ 06 мая 2018

У меня есть файл CSV, который содержит приблизительно 1 ГБ данных. Данные имеют 484 000 строк и 60 столбцов. Я должен ответить на некоторые вопросы, прочитав файл, однако данные очень большие, и мне нужно эффективно управлять памятью. Есть ли эффективный способ хранения данных? Если мне нужно хранить данные в структуре данных, какая структура данных будет эффективна для хранения / управления данными?

Я должен написать код на C ++. В текстовом файле есть данные, которыми нужно манипулировать, в основном используя строки. Я использую Windows в качестве платформы. Файл содержит сетевые ошибки телекоммуникационной компании. Сохраненные данные содержат сбои сети, и на основании этих сбоев я должен ответить на некоторые запросы.

Данные примерно такие:

** "IDENTIFIER", "CLEARANCEREPORTFLAG", "ESCALATEDALARM", "ACKNOWLEDGEMENTUSERIDE", "HANDLEDBY", "CLOSEDBY", "HANDLEDUSERIDENTIFIER", "RELEASEUSERIDENTIFIER", "CLOSEUSERIDENTIFIER", "TERMINATIONUSERIDENTIF", "ACKNOWLEDGEMENTTIMESTA",» HANDLETIMESTAMP», "CLOSETIMESTAMP", "TERMINATIONTIMESTAMP", "RELEASETIMESTAMP", "CREATIONTIMESTAMP", "ARCHIVETIMESTAMP", "CLEARANCETIMESTAMP", "MANAGEDOBJECT", "TARGETENTITIES", "ALARMTYPE", "EVENTTIME", "уголовное дело", "SECURITYALARMCAUSE" , "SPECIFICPROBLEMS", "BACKEDUPSTATUS", "BACKUPOBJECT", "TRENDINDICATION", "THRESHOLDINFO", "NOTIFICATIONIDENTIFIER", "CORRELNOTIFINFO", "STATECHANGEDEFINITION", "MONITOREDATTRIBUTES", "PROPOSEDREPAIRACTIONS", "RuleName", "области",» SECURITYALARMDETECTOR», "EXPORTSEQUENCENAME", "EXPORTSEQUENCENUMBER", "OCNAME", "ALARMCLASS", "ALARMORIGIN", "PARENTALARMOBJECT", "ALARMCOMMENT", "AGENTALARMIDENTIFIER", "AGENTENTITY", "PERCEIVEDSEVERITY", "ADDITIONALTEXT", "ALARMOBJECTOPERATORNO" "ORIGINALSEVERITY", "ORIGINALEVENTTIME", "USERIDENTIFIER", "USERTEXT", "OUTAGEFLAG", "пробл EMOCCURRENCES», "CRITICALPROBLEMOCCURRE", "MAJORPROBLEMOCCURRENCE", "MINORPROBLEMOCCURRENCE", "WARNINGPROBLEMOCCURREN", "INDETERMINATEPROBLEMOC", "CLEARPROBLEMOCCURRENCE", "SATOTAL", "EMS_DOMAIN", "EMS_VENDOR", "EMS_REGION", "EMS_LOCATION", "FRIENDLY_NAME" "NATIVE_CAUSE"

"49487171", "1", "0", "", "", "", "", "", "Auto-Clear", "Auto-Clear", "", "", "8 / 1/2013 5:06:24 "," 02.08.2013 3:28:49 "," "," 02.08.2013 3:28:41 "," 02.08.2013 5:06:24 "," 02.08.2013 3:51:09 "," HW_T2000_Sys ihvtfs01_ns: .T2000_Rawalpindi_06 Managed_Element "" 33554504 "" PTP "" / стеллаж = 1 / полка = 591070 / слот = 11 / домен = wdm / порт = 1 "" CTP "" / och = 1 "" "," 1349806175 "," CommunicationsAlarm "," 02.08.2013 3:51:09 AM " "LossOfSignal", "", "299340460", "", "", "", "", "", "", "", "", "", ""," Домен ihvtfs01_ns: .National_Tx_Huawei_dm " "", "Экспорт", "1", "ihvtfs01_ns: .Nat_Tx_Huawei", "0", "0", "", "", "", "", "майор"," @ Приоритет = 20 @ FC = FC.TXM.KHI @ Outage_Flag = @ NE_Name = Карачи MRD: б @ USER =: добавить: T2000_Rawalpindi_06; 33554504; / стойки = 1 / полки = 591070 / слот = 11 / домен = WDM / порт = 1; / = 1 оч native ProbableCause = SM_BIP8_OVER, служба влияющий = SA_NON_SERVICE_AFFECTING, nativeEMS Имя = T2000_Rawalpindi_06; MRD Карачи; / стойка = 1 / полка = 1246-KHI MRD 2-2 до P / C / slot = 11 / domain = wdm / port = 1; / och = 1, дополнительная информация = AlarmSerialNo = 91292009; AlarmReason = Тревога секции SM уровня OTU ошибка пересечения порога; ProductName = OptiX BWS1600G; EquipmentName = ETMXS; AffirmState = FALSE; DetailInfo = Alarm Параметры (шестнадцатеричные): 0x01 0x00 0x01 0xff 0xff; EMS T2000_Rawalpindi_06 ManagedElement 33554504 PTP / стеллаж = 1 / полка = 591070 / слот = 11 / домен = wdm / порт = 1 CTP / och = 1 @ # @ 1-282 @ # @ BER_SF @ # @ 40 Ссылка INFO: T2000_Rawalpindi_06; Карачи MRD; / стеллаж = 1 / полка = 591070 / слот = 11 / порт = 1; / och = 1 канал INFO1 (wdm): T2000_Rawalpindi_06; MRD Карачи; / стойка = 1 / полка = MRD 1246-KHI От 2-2 до P / C / слот = 11 / домен = wdm / порт = 1; / och = 1 NE_Lookup: Карачи MRD__Karachi MRD; / стойки = 1 / полки = 1246-KHI MRD 2-2 до P / C / слот = 11 / домен = wdm / порт = 1; / och = 1 @ AEnd = EMS T2000_Rawalpindi_06 Управляемый_Элемент Карачи МРД ПТП / Стойки = 1 / полки = 591070 / слот = 11 / домен = WDM @ ZEND = @ SERVICE = :: %%% EMS_DOMAIN = Передача @ EMS_VENDOR = Huawei @ EMS_REGION = National @ EMS_LOCATION = OFS Холл, S / Town @ FRIENDLY_NAME = T2000_Rawalpindi_06; КарачиMRD; / стойки = 1 / полки = 1246-KHI MRD 2-2 до P / C / слот = 11 / домен = WDM / порт = 1; / оч = 1; ETMXS @ NATIVE_CAUSE = SM_BIP8_OVER +++ " "", "Основные"," 8/2/2013 3:51:03 AM " "", "", "", "1", "0", "1", "0", "0", "0", "1", "1", "Передача"," Huawei " "Национальный"," OFS Холл, S / Town "," T2000_Rawalpindi_06; MRD Карачи; / стойка = 1 / полка = 1246-KHI От MRD 2-2 до P / C / слот = 11 / домен = wdm / порт = 1; / och "," SM_BIP8_OVER "**

Это данные первых двух строк. Первый из них похож на заголовки хранимых данных, данные во 2-й строке - это фактические данные, представляющие неисправности. Теперь я должен ответить на такие вопросы, как: Сколько неисправностей произошло в конкретном регионе и т. Д.

1 Ответ

0 голосов
/ 06 мая 2018

Если у вас достаточно ОЗУ, вы можете хранить все строки в одном огромном массиве, а затем создавать структуру для каждой строки, в которой храните указатели на строки. Эти структуры помещаются в массив, который затем можно отсортировать по столбцу.

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

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