2016-07-12 22 views
0

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

У меня есть очень большое количество данных (60 + GB) в формате CSV заказанного ID:

id, "{data}" 
id2, "{data}" 
... 

У меня есть другой набор данных, который должен быть объединен с этими данными в словаре формата (в настоящее время распались над некоторыми маринованные файлов):

{player_id: {rating, [ids]}, player_id2: {rating, [ids]}, ... } 

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

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

Есть ли более быстрый способ сделать это? Я чувствую, что я очень глуп, и есть более быстрый способ, так как мое решение с многопроцессорностью все равно займет 2 недели, чтобы закончить.

С удовольствием уточняю, неясен ли мой вопрос. Благодарю.

+1

Использование CSV для 60 ГБ данных - не очень хорошая идея именно по тем причинам, которые вы здесь находите. Можно ли переместить его в базу данных [NoSQL] (https://en.wikipedia.org/wiki/NoSQL)? – Tim

+0

являются идентификаторами всегда последовательными? (1,2, ..., N)? и вы просто пытаетесь найти один (с id X?) –

+0

Может быть, попробуйте pandas pandas.pydata.org –

ответ

0
def get_row(id): 
    with open("fname.csv") as f: 
     row = next(itertools.islice(f,id-1,id),None) 
    return row 

его все еще будет мучительно медленно ... вы должны думать об использовании базы данных ... или, по крайней мере, хранить данные в виде фиксированной ширины записи (т.е. всегда 37 байт на строку), если вы хранить фиксированные записи ширины, вы можете рассчитать смещение offset = id*37;f.seek(offset);return f.read(37), и это должно быть ~ примерно постоянное время ...

+0

Существует ли конкретный тип базы данных с python api, который имеет быстрое время доступа? Самое большое узкое место, безусловно, в/в, даже при постоянном поиске. – ddnm

+0

Предполагая, что вы запрашиваете индексированное поле, оно должно быть близким к постоянному времени поиска ... и времени доступа ... в почти любом sql ... Im меньше разбирается с nosql, но я понимаю, что nosql легко распараллеливается для поиска –

Смежные вопросы