Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理—我们是否可以将(itertools.islice)iterable直接传递到pool.imap,而不转换为列表?_Python_Multithreading_Iterator_Multiprocessing_Generator - Fatal编程技术网

Python多处理—我们是否可以将(itertools.islice)iterable直接传递到pool.imap,而不转换为列表?

Python多处理—我们是否可以将(itertools.islice)iterable直接传递到pool.imap,而不转换为列表?,python,multithreading,iterator,multiprocessing,generator,Python,Multithreading,Iterator,Multiprocessing,Generator,在从DB2中分块读取一个大表(有些表有1亿个)之后,我使用itertools.islice将generator对象转换为迭代器。我将迭代器传递给multiprocessing pool.map,它调用一个函数来并行地将这些块提取到CSV 它可以工作,但在并行运行开始之前,pythonpool.map会将迭代器转换为一个耗费大量时间的列表。有什么方法可以避免创建此列表或更快地转换为列表?我也尝试过使用POOL.IMAP,但当我运行程序时,我的笔记本内核死机了。要使用IMAP,我必须将迭代器转换为一

在从DB2中分块读取一个大表(有些表有1亿个)之后,我使用itertools.islice将generator对象转换为迭代器。我将迭代器传递给multiprocessing pool.map,它调用一个函数来并行地将这些块提取到CSV

它可以工作,但在并行运行开始之前,pythonpool.map会将迭代器转换为一个耗费大量时间的列表。有什么方法可以避免创建此列表或更快地转换为列表?我也尝试过使用POOL.IMAP,但当我运行程序时,我的笔记本内核死机了。要使用IMAP,我必须将迭代器转换为一个列表,这需要再次花费时间。有什么想法吗

generator_df = pd.read_sql(query2, test_connection_forbankcv_connection, chunksize = 5000)
iterable_slice = list(it.islice(generator_df, slice_start,slice_end))
results = p.imap(chunk_to_csv, iterable_slice, 1) 

我马上承认,这个解决方案有一些问题,但它显示了基本思想:

import itertools
from typing import Iterable
from multiprocessing import Pool

class Lengthed_ISlice:
    def __init__(self, iterable: Iterable, start: int, stop: int):
        self._start = start
        self._stop = stop
        self._islice = itertools.islice(iterable, self._start, self._stop)

    def __len__(self):
        return self._stop - self._start

    def __iter__(self):
        return iter(self._islice)
这是
islice
对象上的一个薄包装器,该对象实现了所需的
\uuuu len\uuuu
方法,因此它将与
池的
映射
方法一起工作:

def double(n):
    return n * 2

my_list = list(range(10, 100))

with Pool() as p:
    print(p.map(double, Lengthed_ISlice(my_list, 2, 9)))
    # Prints [24, 26, 28, 30, 32, 34, 36]
主要问题:

  • 除了
    \uuuu iter\uuuu
    之外,它没有正确地将任何功能委托给底层的
    islice
    。如果在扩展此方法的使用时/如果在缺少方法方面出现错误,则需要实现正确的方法
  • 为简洁起见,我不必为步骤费心,因为您没有使用非默认步骤,而且它们会使数学稍微复杂一点
  • 我不担心使用
    Iterable
    的泛型参数。如果您想要更好的类型暗示,那么应该为构造函数参数和
    \uuuuuuuuuuuuuuuuuuuuuuuu
    引入
    TypeVar

我马上承认,这个解决方案有一些问题,但它展示了基本思想:

import itertools
from typing import Iterable
from multiprocessing import Pool

class Lengthed_ISlice:
    def __init__(self, iterable: Iterable, start: int, stop: int):
        self._start = start
        self._stop = stop
        self._islice = itertools.islice(iterable, self._start, self._stop)

    def __len__(self):
        return self._stop - self._start

    def __iter__(self):
        return iter(self._islice)
这是
islice
对象上的一个薄包装器,该对象实现了所需的
\uuuu len\uuuu
方法,因此它将与
池的
映射
方法一起工作:

def double(n):
    return n * 2

my_list = list(range(10, 100))

with Pool() as p:
    print(p.map(double, Lengthed_ISlice(my_list, 2, 9)))
    # Prints [24, 26, 28, 30, 32, 34, 36]
主要问题:

  • 除了
    \uuuu iter\uuuu
    之外,它没有正确地将任何功能委托给底层的
    islice
    。如果在扩展此方法的使用时/如果在缺少方法方面出现错误,则需要实现正确的方法
  • 为简洁起见,我不必为步骤费心,因为您没有使用非默认步骤,而且它们会使数学稍微复杂一点
  • 我不担心使用
    Iterable
    的泛型参数。如果您想要更好的类型暗示,那么应该为构造函数参数和
    \uuuuuuuuuuuuuuuuuuuuuuuu
    引入
    TypeVar

你会考虑使用星火吗?Pyspark,如果您喜欢python。它将使您的生活更轻松。
\u map\u async
的源表示它要求传递的
iterable
具有
\u len\u
属性,如果没有,则将其转换为列表。所有的
map
变体似乎都委托给该方法,因此似乎没有办法绕过它。您可以在自己处理iterable的地方,使用
apply\u async
装配一些东西。@Carcigenicate。很难用
\uu len\uuu
实现迭代器,因为“笔记本内核死机”的信息量不大。在一个不隐藏在GUI中的Python进程中,究竟发生了什么?MadPhysician我想在这个特定的情况下,您可以在一个slice对象上创建一个包装器,该包装器公开一个长度属性,因为长度是可以计算出来的。一般来说,迭代器可以是无限的,所以长度可能没有意义。你会考虑使用Skar吗?Pyspark,如果您喜欢python。它将使您的生活更轻松。
\u map\u async
的源表示它要求传递的
iterable
具有
\u len\u
属性,如果没有,则将其转换为列表。所有的
map
变体似乎都委托给该方法,因此似乎没有办法绕过它。您可以在自己处理iterable的地方,使用
apply\u async
装配一些东西。@Carcigenicate。很难用
\uu len\uuu
实现迭代器,因为“笔记本内核死机”的信息量不大。在一个不隐藏在GUI中的Python进程中,究竟发生了什么?MadPhysician我想在这个特定的情况下,您可以在一个slice对象上创建一个包装器,该包装器公开一个长度属性,因为长度是可以计算出来的。但一般来说,迭代器可以是无限的,所以长度可能没有意义。非常感谢您的快速响应。我会尽力让你知道的。非常感谢你的快速回复。我会尽力让你知道的。