Как выяснить, почему мои потоковые данные останавливаются?

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

Я использую QuickFix с Python 2.7 для подключения к фьючерсным рынкам, и я использую pandas для обработки данных и помещения их в фреймы данных и т. д. Процесс выглядит следующим образом:

  1. Подключитесь к адаптеру TT FIX, который обеспечивает доступ к обмену.

  2. Отправьте MarketDataIncrementalRefreshRequest, что приведет к потоковой передаче данных (об этом сообщается каждый раз, когда совершается сделка). В результате время между входящими сообщениями в периоды занятости может составлять порядка 10 миллисекунд.

  3. Каждое сообщение анализируется, преобразуется в кадр данных pandas и объединяется с уже существующим кадром данных для этого рынка. Код для этого:

    #df is dataframe of trades with 10 columns
    df.index = pd.to_datetime(df.TIME)
    #concatenate with prior data 
    #TS_DIC is a dictionary holding trade data for various markets
    try:
        df_prev = TS_DIC[market_key]
        TS_DIC[market_key] = pd.concat([df_prev,df])
    
    except:
        #in the case this is the first message received:
        TS_DIC[market_key] = df
    
    #now write to disk
    try: 
    #if file exists just write
        to_file = open('path/for/data', 'a+')
        df.to_csv(mode='a+', path_or_buf= to_file, header=False, index=False)
        to_file.close()
    except: 
    #create the file with headers and write
        to_file = open(path+name, 'wb')
        df.to_csv( path_or_buf= to_file, index=False)
        to_file.close()
    

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

Я был бы признателен за помощь всем, кто привык к высокопроизводительным данным и, возможно, даже к этим программным пакетам.

В чем здесь может быть проблема? Как понять, что идет не так?


person Wapiti    schedule 08.02.2014    source источник
comment
Прямо сейчас, когда он останавливается, вы ничего не видите, потому что исключения подавлены. Чтобы помочь вам на вашем пути, я бы посоветовал не использовать исключения, ловящие все, включая системные ошибки. А затем сообщать об исключениях через стандартный вывод или ведение журнала. Для обоих исключений попробуйте изменить их на except Exception as err: и на следующей строке print(str(err)).   -  person CasualDemon    schedule 08.02.2014
comment
Спасибо @CasualDemon, я попробую это, как только рынок откроется в воскресенье вечером.   -  person Wapiti    schedule 08.02.2014
comment
Кроме того, вы можете использовать модуль traceback для печати трассировки. traceback.print_exc() распечатает трассировку для текущего исключения.   -  person All Workers Are Essential    schedule 08.02.2014
comment
Спасибо. Я проверю документацию модуля.   -  person Wapiti    schedule 08.02.2014


Ответы (1)


Я решил, что любой, кто столкнется с этим вопросом, узнает, как я его решил:

Печать ошибок, предложенных в комментариях выше, на самом деле не помогла решить проблему. Данные по-прежнему будут останавливаться без ошибок печати. Причина заключалась в том, что иногда QuickFix загружался в автономном режиме по какой-либо причине и автоматически входил в систему. Очевидно, это то, с чем приходится иметь дело приложениям FIX.

Что происходило: поскольку я инициировал загрузку данных вручную, каждый раз, когда я загружался в автономном режиме, данные останавливались. Таким образом, поместив запрос данных в функцию OnLogon QuickFix, я смог автоматически повторять запросы на загрузку всякий раз, когда программа входила в систему.

Это решило мою проблему. Спасибо CasualDemon и cpburnz.

person Wapiti    schedule 21.02.2014