Самый быстрый способ переформатировать терабайты данных - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть сотни файлов по 10 Гбайт каждый. Мне нужно переформатировать файлы и объединить их в более удобный формат таблицы, чтобы я мог группировать, суммировать, усреднять и т. Д. Данные. Переформатирование данных с использованием Python заняло бы больше недели. Даже после того, как я переформатирую его в таблицу, я не знаю, будет ли он слишком большим для фрейма данных, но одна проблема за раз.

Кто-нибудь может предложить более быстрый способ переформатирования текстовых файлов? Я рассмотрю что-нибудь C ++, Perl и т. Д.

Пример данных:

Scenario:  Modeling_5305 (0.0001)

Position:  NORTHERN UTILITIES SR NT,

"  ","THEO/Effective Duration","THEO/Yield","THEO/Implied Spread","THEO/Value","THEO/Price","THEO/Outstanding Balance","THEO/Effective Convexity","ID","WAL","Type","Maturity Date","Coupon Rate","POS/Position Units","POS/Portfolio","POS/User Defined 1","POS/SE Cash 1","User Defined 2","CMO WAL","Spread Over Yield",

"2017/12/31",16.0137 T,4.4194 % SEMI 30/360,0.4980 % SEMI 30/360,"6,934,452.0000 USD","6,884,052.0000 USD","7,000,000.0000 USD",371.6160 T,CachedFilterPartitions-PL_SPLITTER.2:665876C#3,29.8548 T,Fixed Rate Bond,2047/11/01,4.3200 % SEMI 30/360,"70,000.0000",All Portfolios,030421000,0.0000 USD,FRB,N/A,0.4980 % SEMI 30/360,

"2018/01/12",15.5666 T,4.8499 % SEMI 30/360,0.4980 % SEMI 30/360,"6,477,803.7492 USD","6,418,163.7492 USD","7,000,000.0000 USD",356.9428 T,CachedFilterPartitions-PL_SPLITTER.2:665876C#3,29.8219 T,Fixed Rate Bond,2047/11/01,4.3200 % SEMI 30/360,"70,000.0000",All Portfolios,030421000,0.0000 USD,FRB,N/A,0.4980 % SEMI 30/360,

Scenario:  Modeling_5305 (0.0001)

Position:  OLIVIA ISSUER TR SER A (A,

"  ","THEO/Effective Duration","THEO/Yield","THEO/Implied Spread","THEO/Value","THEO/Price","THEO/Outstanding Balance","THEO/Effective Convexity","ID","WAL","Type","Maturity Date","Coupon Rate","POS/Position Units","POS/Portfolio","POS/User Defined 1","POS/SE Cash 1","User Defined 2","CMO WAL","Spread Over Yield",

"2017/12/31",1.3160 T,19.0762 % SEMI 30/360,0.2990 % SEMI 30/360,"3,862,500.0000 USD","3,862,500.0000 USD","5,000,000.0000 USD",2.3811 T,CachedFilterPartitions-PL_SPLITTER.2:681071AA4,1.3288 T,Interest Rate Index Linked Note,2019/05/30,0.0000 % MON 30/360,"50,000.0000",All Portfolios,010421002,0.0000 USD,IRLIN,N/A,0.2990 % SEMI 30/360,

"2018/01/12",1.2766 T,21.9196 % SEMI 30/360,0.2990 % SEMI 30/360,"3,815,391.3467 USD","3,815,391.3467 USD","5,000,000.0000 USD",2.2565 T,CachedFilterPartitions-PL_SPLITTER.2:681071AA4,1.2959 T,Interest Rate Index Linked Note,2019/05/30,0.0000 % MON 30/360,"50,000.0000",All Portfolios,010421002,0.0000 USD,IRLIN,N/A,0.2990 % SEMI 30/360,

Я хотел бы переформатировать в эту таблицу CSV, чтобы я мог импортировать в dataframe:

Position, Scenario, TimeSteps, THEO/Value

NORTHERN UTILITIES SR NT, Modeling_5305, 2018/01/12, 6477803.7492

OLIVIA ISSUER TR SER A (A, Modeling_5305, 2018/01/12, 3815391.3467

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я бы использовал C / C ++ с отображением памяти.

С отображением памяти вы можете просматривать данные, как если бы это был один большой массив байтов (и это также предотвратит копирование данных из пространства ядра в пространство пользователя (в Windows, не уверенно в Linux)).

Для очень больших файлов вы можете отображать один блок за раз (например, 10 ГБ).

Для записи используйте буфер (скажем, 1 МБ) для сохранения результатов, а затем каждый раз записывайте этот буфер в файл (используя fwrite()).

Что бы вы ни делали, не используйте потоковый ввод-вывод или readline().

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

Если у вас есть возможность, запишите данные на другой (физический) диск, чем тот, с которого вы читаете.

0 голосов
/ 06 сентября 2018

Есть два больших узких места, когда вам приходится манипулировать большими файлами или большим количеством файлов.Одним из них является ваша файловая система, которая ограничена вашим жестким диском или SSD (носителем), подключением к носителю и вашей операционной системой.Обычно вы не можете это изменить.Но вы должны спросить себя, какова моя максимальная скорость?Как быстро система может читать и писать?Вы никогда не можете быть быстрее, чем это.Примерная оценка максимальной скорости - это время, которое вам нужно для чтения всех ваших данных, плюс время, необходимое для записи всех ваших данных.

Другим узким местом является библиотека, которую вы используете для внесения изменений.Не все пакеты Python созданы равными, есть огромные различия в скорости.Я рекомендую попробовать несколько подходов на небольшом тестовом образце, пока не найдете подходящий для вас.

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

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

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