Чтение большого количества данных с помощью pool.map ('error (для формата "i" требуется -2147483648 <= number <= 2147483647 ")') - PullRequest
0 голосов
/ 27 июня 2019

Я читаю данные из баз данных.Мне нужно читать с нескольких серверов (узлов) одновременно, поэтому я хочу использовать pool.map.

Я пытаюсь сделать это следующим образом:

import pathos.pools as pp
import pandas as pd
import urllib

class DataProvider():
    def __init__(self, hosts):

        self.hosts_read = hosts

    def read_data(self, host_index):
        '''
        Read data from current node

        '''
        limit = 1000000
        host = self.hosts_read[host_index]
        query = f"select FIELD1 from table_name limit {limit}"
        url = urllib.parse.urlencode({'query': query})
        df = pd.io.parsers.read_csv(f'http://{host}:8123/?{url}',
                                    sep="\t", names=['FIELD1'], low_memory=False)
        return df


    def pool_read(self, num_workers):
        '''
        Read from data using Pool of workers.
        Return list of lists - every list is a data from current worker.
        '''
        pool = pp.ProcessPool(num_workers)
        result = pool.map(self.read_data, range(len(self.hosts_read)))
        return result

if __name__ == '__main__':
    provider = DataProvider(host=['server01.com', 'server02.com'])
    data = provider.pool_read(num_workers=n_cpu)

Он отлично работает при ограничениине так много (ниже 4 миллионов).И дробится, если оно больше:

multiprocess.pool.MaybeEncodingError: Ошибка отправки результата: '[my_pandas_dataframe]'.Причина: 'ошибка (для формата' 'i' требуется -2147483648 <= число <= 2147483647 ") '</p>

Я нашел несколько ответов по этому поводу: причина в том, что мы не можем вернуть из пула мир данныхбольше 2 ГБ.Например: SO link .Но нет никаких идей или решений, как работать, если мне нужно загружать большие детали!

PS Я использую модуль pathos , но это не важно, такая же ошибка и для многопроцессорного модуля.

...