2013-12-03 1 views
1

простой проблемы, но, возможно, хитрый ответ:обработка огромного файла с питоном и pytables

Проблемы заключается в том, как обрабатывать огромный файл .txt с pytables.

У меня есть большой файл .txt, с миллионами строк, короткими линиями, например:

line 1 23458739 
line 2 47395736 
........... 
........... 

Содержание этого .txt должно быть сохранено в pytable, хорошо, это легко. Больше ничего не нужно делать с информацией в txt-файле, просто скопируйте в pytables, теперь у нас есть pytable с, например, 10 столбцами и миллионами строк.

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

Решение 1: сначала скопируйте весь текстовый файл, строка за строкой в ​​pytable (миллионы), а затем повторите по каждой строке на pytable (миллионы снова) и, в зависимости от значений, сгенерируйте новые столбцы, необходимые для pytable ,

Решение 2: прочитайте строку за строкой .txt-файла, сделайте все необходимое, вычислите новые необходимые значения и затем отправьте всю информацию на пирамиду.

Решение 3: ..... любое другое эффективное и быстрое решение ???

+0

Вы пытались сравнить? Обратите внимание, что результаты тестов могут зависеть от типа операций, которые вы выполняете. – alko

+0

Нет, я этого не делал, я не знаю, как это сделать на самом деле, я думал, что, возможно, у кого-то была аналогичная проблема, и, возможно, он мог бы дать совет. – codeKiller

+0

Это просто, вы должны реализовать оба решения и время их против тестового файла. – alko

ответ

1

Я думаю, что основная проблема здесь - одна из концептуальных моделей. Таблицы PyTables обрабатывают только обычные (или структурированные) данные. Однако данные, которые у вас есть, являются нерегулярными или неструктурированными в том, что структура определяется при чтении данных. С другой стороны, PyTables нуждается в описании столбца, которое должно быть известно полностью к моменту, когда вызывается create_table(). Об этом нет.

Поскольку в вашей задаче о проблемах любая строка может добавить новый столбец, у вас нет выбора, кроме как сделать это за два полных прохода через данные: (1) прочитать данные и определить столбцы и (2) записать данные к столу. В псевдокоде:

import tables as tb 
cols = {} 

# discover columns 
d = open('data.txt') 
for line in d: 
    for col in line: 
     if col not in cols: 
      cols['colname'] = col 

# write table 
d.seek(0) 
f = tb.open_file(...) 
t = f.create_table(..., description=cols) 
for line in d: 
    row = line_to_row(line) 
    t.append(row) 

d.close() 
f.close() 

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