使用pool.map读取大量数据(“ error(“ i”格式要求-2147483648 <= number <= 2147483647“)')

时间:2019-06-27 13:59:17

标签: python multiprocessing pathos

我正在从数据库中读取数据。我需要同时读取多个服务器(节点),所以我想使用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)

它的工作原理非常完美,而限制不是很多(低于400万)。并粉碎它是否更大:

  

multiprocess.pool.MaybeEncodingError:发送结果错误:   “ [my_pandas_dataframe]”。原因:'error(“'i'格式要求   -2147483648 <=数字<= 2147483647“)'

我找到了一些答案:这是因为我们无法从池中返回大于2 GB的数据。例如:SO link。但是没有任何想法或解决方案,如果我需要装载更大的零件,该如何工作!

P.S。我使用pathos模块,但在这里并不重要-多处理模块也有同样的错误。

0 个答案:

没有答案