2016-10-31 9 views
1

파이썬이 어떻게 작동하는지 질문하고 있습니다. 매우 큰 데이터 세트 (200GB)가 있으며 파이썬을 사용하여 선을 반복하고 사전에 데이터를 저장 한 다음 계산을 수행 할 예정입니다. 마지막으로 계산 된 데이터를 CSV 파일에 기록합니다. 내 컴퓨터 용량에 문제가 있습니다. 나는 나의 RAM이 그 큰 데이터 세트를 저장할 수 없다는 (또는 꽤 확신하는) 것이 두렵다. 더 좋은 방법이 있습니까?은 RAM 제약으로 인해 사전에 큰 데이터 세트 (200GB)를 읽을 수 있습니까?

다음
#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. 읽기 및 키와 사전에 저장할 [기호] [시간] [입찰 ]와 [ask] etc.
  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 
+0

200GB의 디스크 공간이 있으면 컴퓨터가 RAM 교체를 시작하기 만합니다. 이것은 기술적으로 효과가 있지만 매우 느릴 것입니다. 특히 SSD가 아닌 회전 디스크를 사용하는 경우 특히 그렇습니다. 대신, 한 번에 몇 MB의 파일을 읽고, 그 라인을 처리 한 다음, 출력 파일에 쓰고, 모든 것을 읽고 처리 할 때까지 헹구고 반복해야합니다. – BallpointBen

+0

@BallpointBen 감사합니다. 코드 예제를 제공해 주시겠습니까? – duckman

+0

@BallpointBen이 64 비트 OS와 함께 64 비트 버전의 Python을 사용하는 경우에만 스왑에 대해 언급 한 내용이 사실입니다. – martineau

답변

1

이것은 당신이 물건을 저장하는 방법은 매우 큰 데이터 세트 같은 것들에 들어가기로 많이 중요하기 때문에 대답하기가 어렵습니다. 또한 데이터 세트 크기를 정의하는 방법도 중요합니다.

이 파일이 200GB를 소비하는 CSV 파일 인 경우 컴퓨터에 이진 형식으로 저장할 수 있으며 8GB와 같은 용량을 차지합니다. 다시 말하지만, 데이터의 각 수치에 대해 파이썬 객체를 사용한다면 실제 사용 된 1TB에 가까울 수 있습니다.

RAM에 들어갈 수있는 데이터 세트가 RAM에 적합하도록하려면 원시 C 구조에 대한 인터페이스를 제공하는 numpy와 같은 것을 사용하십시오. struct.pack과 같은 것을 사용하여 데이터를 C 유형으로 강제 변환 할 수 있습니다.

데이터 세트가 RAM에 들어 가지 않을 가능성이있는 경우 해당 데이터를 분석하는 다른 방법을 살펴보고 싶습니다. 이러한 다른 방법은 데이터베이스 및/또는 "R"과 같은 다른 언어와 같은 것입니다. 당신은 외출하고 수톤의 숫양으로 서버를 구입할 수도 있습니다.

+0

데이터를 처리하는 다른 방법의 경우 점진적으로 언급하는 것을 잊었을뿐 아니라 여러 번 전달하는 것도 잊어 버렸습니다. – martineau