小编Tat*_*eyr的帖子

以某种方式使用abc.ABCMeta,它与Python 2.7和Python 3.5兼容

我想创建一个具有abc.ABCMeta元类的类,并且与Python 2.7和Python 3.5兼容.到目前为止,我只能在2.7或3.5上成功实现这一点 - 但从不同时在两个版本上.有人可以帮我一把吗?

Python 2.7:

import abc
class SomeAbstractClass(object):
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def do_something(self):
        pass
Run Code Online (Sandbox Code Playgroud)

Python 3.5:

import abc
class SomeAbstractClass(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def do_something(self):
        pass
Run Code Online (Sandbox Code Playgroud)

测试

如果我们使用合适版本的Python解释器(Python 2.7 - >示例1,Python 3.5 - >示例2)运行以下测试,则它在以下两种情况下都会成功:

import unittest
class SomeAbstractClassTestCase(unittest.TestCase):
    def test_do_something_raises_exception(self):
        with self.assertRaises(TypeError) as error:
            processor = SomeAbstractClass()
        msg = str(error.exception)
        expected_msg = "Can't instantiate abstract class SomeAbstractClass with abstract methods do_something"
        self.assertEqual(msg, expected_msg)
Run Code Online (Sandbox Code Playgroud)

问题

在使用Python 3.5运行测试时,预期的行为不会发生(TypeError在实例化时不会引发SomeAbstractClass):

======================================================================
FAIL: test_do_something_raises_exception (__main__.SomeAbstractClassTestCase)
----------------------------------------------------------------------
Traceback …
Run Code Online (Sandbox Code Playgroud)

python metaclass abc python-2.7 python-3.5

45
推荐指数
4
解决办法
2万
查看次数

优化内存密集型数据流管道的 GCP 成本

我们希望降低在 GCP Dataflow 中运行特定 Apache Beam 管道 (Python SDK) 的成本。

我们构建了一个内存密集型 Apache Beam 管道,它需要大约 8.5 GB 的 RAM 才能在每个执行程序上运行。一个大型机器学习模型目前以一种转换DoFn.setup方法加载,因此我们可以为数百万用户预先计算推荐。

现有 GCP Compute Engine 机器类型的内存/vCPU 比率低于我们的要求(每个 vCPU 最多 8GB RAM)或更高的比例(每个 vCPU 24GB RAM):https : //cloud.google.com/compute/文档/机器类型#machine_type_comparison

我们已使用 GCPm1-ultramem-40机器类型成功运行此管道。然而,硬件使用——因此,成本——是次优的。此机器类型的比率为每个 vCPU 24 GB RAM。当使用它来运行上述管道时,虚拟机使用了不到 36% 的可用内存——但是,正如预期的那样,我们为此付出了全部。

尝试使用custom-2-13312机器类型(2 个 vCPU 和 13 GB RAM)运行相同的管道时,Dataflow 崩溃,并显示错误:

   Root cause: The worker lost contact with the service.
Run Code Online (Sandbox Code Playgroud)

在监控运行 Dataflow 作业的 Compute Engine 实例时,很明显它们的内存不足。Dataflow 尝试将模型加载到内存中两次——每个 vCPU 一次——但可用内存仅够一个。

如果我们能够通知 Apache Beam/Dataflow 特定转换需要特定数量的内存,那么问题就会得到解决。但是我们没有设法找到实现这一目标的方法。

我们能想到的另一个解决方案是尝试更改每个 …

google-cloud-platform google-cloud-dataflow apache-beam

6
推荐指数
1
解决办法
626
查看次数