2016-10-25 5 views
2

У меня вопрос о том, как функция Python. У меня очень большой набор данных (200 ГБ), и я собираюсь использовать python для итерации по строкам, хранения данных в словаре и последующего вычисления. Наконец, я напишу вычисленные данные в файл CSV. Моя забота о емкости моего компьютера. Я боюсь (или довольно уверен), что моя оперативная память не может хранить этот большой набор данных. Есть ли способ лучше? Вот структура входных данных:большой словарь в python превышает RAM емкость

#RIC Date[L] Time[L] Type ALP-L1-BidPrice ALP-L1-BidSize ALP-L1-AskPrice ALP-L1-AskSize ALP-L2-BidPrice ALP-L2-BidSize ALP-L2-AskPrice ALP-L2-AskSize ALP-L3-BidPrice ALP-L3-BidSize ALP-L3-AskPrice ALP-L3-AskSize ALP-L4-BidPrice ALP-L4-BidSize ALP-L4-AskPrice ALP-L4-AskSize ALP-L5-BidPrice ALP-L5-BidSize ALP-L5-AskPrice ALP-L5-AskSize TOR-L1-BidPrice TOR-L1-BidSize TOR-L1-AskPrice TOR-L1-AskSize TOR-L2-BidPrice TOR-L2-BidSize TOR-L2-AskPrice TOR-L2-AskSize TOR-L3-BidPrice TOR-L3-BidSize TOR-L3-AskPrice TOR-L3-AskSize TOR-L4-BidPrice TOR-L4-BidSize TOR-L4-AskPrice TOR-L4-AskSize TOR-L5-BidPrice TOR-L5-BidSize TOR-L5-AskPrice TOR-L5-AskSize 
HOU.ALP 20150901 30:10.8 Market Depth 5.29 50000 5.3 16000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 5.29 50000 5.3 46000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 
HOU.ALP 20150901 30:10.8 Market Depth 5.29 50000 5.3 22000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 5.29 50000 5.3 36000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 
HOU.ALP 20150901 30:10.8 Market Depth 5.29 50000 5.3 32000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 5.29 50000 5.3 40000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 
HOU.ALP 20150901 30:10.8 Market Depth 5.29 50000 5.3 44000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 5.29 50000 5.3 36000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 
HOU.ALP 20150901 30:12.1 Market Depth 5.29 50000 5.3 32000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 5.29 50000 5.3 46000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 
HOU.ALP 20150901 30:12.1 Market Depth 5.29 50000 5.3 38000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 5.29 50000 5.3 36000 5.28 50000 5.31 50000 5.27 50000 5.32 50000 5.26 50000 5.33 50000   5.34 50000 

Вот что я пытаюсь сделать: 1. чтения в данных TĀ и хранить их в словарь с ключами [символов] [время] [ставку] и [ спросите] и т. д. 2. в любой момент времени найдите лучшую цену предложения и цену лучшего спроса (это требует сортировки по горизонтали/между значениями в ключе, которые я не знаю, как), так как цены предложения и спроса поступают от разных обменов, нам нужно найти лучшие цены и ранжировать их от лучших до худших вместе с объемом для этой конкретной цены. 3. Экспорт в файл csv.

Вот моя попытка по кодам. Пожалуйста, помогите мне написать его более эффективным:

# this file calculate the depth up to $50,000 

import csv 
from math import ceil 
from collections import defaultdict 

# open csv file 
csv_file = open('2016_01_04-data_3_stocks.csv', 'rU') 
reader = csv.DictReader(csv_file) 

# Set variables: 
date = None 
exchange_depth = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(float)))) 
effective_spread = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(float)))) 
time_bucket = [i * 100000.0 for i in range(0, 57600000000/100000)] 

# Set functions 
def time_to_milli(times): 
    hours = float(times.split(':')[0]) * 60 * 60 * 1000000 
    minutes = float(times.split(':')[1]) * 60 * 1000000 
    seconds = float(times.split(':')[2]) * 1000000 
    milliseconds = float(times.split('.')[1]) 
    timestamp = hours + minutes + seconds + milliseconds 
    return timestamp 


# Extract data 
for i in reader: 
    if not bool(date): 
     date = i['Date[L]'][0:4] + "-" + i['Date[L]'][4:6] + "-" + i['Date[L]'][6:8] 
    security = i['#RIC'].split('.')[0] 
    exchange = i['#RIC'].split('.')[1] 
    timestamp = float(time_to_milli(i['Time[L]'])) 
    bucket = ceil(float(time_to_milli(i['Time[L]']))/100000.0) * 100000.0 
    # input bid price and bid size 
    exchange_depth[security][bucket][Bid][i['ALP-L1-BidPrice']] += i['ALP-L1-BidSize'] 
    exchange_depth[security][bucket][Bid][i['ALP-L2-BidPrice']] += i['ALP-L2-BidSize'] 
    exchange_depth[security][bucket][Bid][i['ALP-L3-BidPrice']] += i['ALP-L3-BidSize'] 
    exchange_depth[security][bucket][Bid][i['ALP-L4-BidPrice']] += i['ALP-L4-BidSize'] 
    exchange_depth[security][bucket][Bid][i['ALP-L5-BidPrice']] += i['ALP-L5-BidSize'] 
    exchange_depth[security][bucket][Bid][i['TOR-L1-BidPrice']] += i['TOR-L1-BidSize'] 
    exchange_depth[security][bucket][Bid][i['TOR-L2-BidPrice']] += i['TOR-L2-BidSize'] 
    exchange_depth[security][bucket][Bid][i['TOR-L3-BidPrice']] += i['TOR-L3-BidSize'] 
    exchange_depth[security][bucket][Bid][i['TOR-L4-BidPrice']] += i['TOR-L4-BidSize'] 
    exchange_depth[security][bucket][Bid][i['TOR-L5-BidPrice']] += i['TOR-L5-BidSize'] 
    # input ask price and ask size 
    exchange_depth[security][bucket][Ask][i['ALP-L1-AskPrice']] += i['ALP-L1-AskSize'] 
    exchange_depth[security][bucket][Ask][i['ALP-L2-AskPrice']] += i['ALP-L2-AskSize'] 
    exchange_depth[security][bucket][Ask][i['ALP-L3-AskPrice']] += i['ALP-L3-AskSize'] 
    exchange_depth[security][bucket][Ask][i['ALP-L4-AskPrice']] += i['ALP-L4-AskSize'] 
    exchange_depth[security][bucket][Ask][i['ALP-L5-AskPrice']] += i['ALP-L5-AskSize'] 
    exchange_depth[security][bucket][Ask][i['TOR-L1-AskPrice']] += i['TOR-L1-AskSize'] 
    exchange_depth[security][bucket][Ask][i['TOR-L2-AskPrice']] += i['TOR-L2-AskSize'] 
    exchange_depth[security][bucket][Ask][i['TOR-L3-AskPrice']] += i['TOR-L3-AskSize'] 
    exchange_depth[security][bucket][Ask][i['TOR-L4-AskPrice']] += i['TOR-L4-AskSize'] 
    exchange_depth[security][bucket][Ask][i['TOR-L5-AskPrice']] += i['TOR-L5-AskSize'] 
# Now rank bid price and ask price among exchange_depth[security][bucket][Bid] and exchange_depth[security][bucket][Ask] keys 
    #I don't know how to do this 
+5

Если обработать построчно, и словарь, используемый для обработка данных не превышает вашу оперативную память, у вас не должно быть никаких проблем. –

+1

Как @FranciscoCouzo сказал, если вы _iterate_ через строки (не загружая все в память), и словарь достаточно мал, вы должны быть в порядке. Однако, если вы предоставили некоторые примеры данных (несколько строк набора данных) и тип вычислений, которые вы пытаетесь выполнить, мы, вероятно, могли бы дать вам лучший ответ. – BorrajaX

+2

это кажется слишком широким или отсутствующим [mcve] –

ответ

0

Основываясь на том, что вы сказали нам, вот что вы можете сделать:

import csv 
with open("path/to/my_dataset", 'r') as input_f, open("output.csv", 'a') as output_f: 
    # Keep reading lines from input data until you run out 
    for line in f: 
     # do processing and add to processed 
     processed = [] 

     # write processed data to output file 
     csv.writer(output_f).writerow(processed) 
+0

Немного смутно, почему вы не просто для 'for line_num, line in enumerate (f, 1):' вместо двух вызовов 'readline' снаружи и внутри цикла' while' с подсчетом номера строки вручную. Кроме того, почему вы не просто открываете выходной файл один раз, обертываете в 'csv.writer' один раз и записываете каждую строку по завершении, сохраняя не несущественные затраты на постоянное открытие и закрытие файла; пакетное их бессмысленно, объект файла будет буферизовать для вас в любом случае. – ShadowRanger

+0

@ShadowRanger. Вы правы, я просто прошел через это. Это хорошие упрощения. –

+0

@ShadowRanger. Выделение записей может быть полезно, если вы записываете в выходной файл только один раз каждый х строк ввода. –