【问题标题】:How do I dump a joblib or pickle file in Bluemix Object Storage?如何在 Bluemix Object Storage 中转储 joblib 或 pickle 文件?
【发布时间】:2016-05-13 07:53:28
【问题描述】:

我正在使用在 Bluemix 上运行 Flask 的 Python 应用程序。我知道如何将对象存储与 swiftclient 模块一起使用来创建容器并在其中保存文件,但是如何转储其中包含的 joblib 或 pickle 文件?以及如何将其加载回我的 Python 程序中?

这是存储简单文本文件的代码。

import swiftclient

app = Flask(__name__)
CORS(app)


cloudant_service = json.loads(os.environ['VCAP_SERVICES'])['Object-Storage'][0]
objectstorage_creds = cloudant_service['credentials']

if objectstorage_creds:
   auth_url = objectstorage_creds['auth_url'] + '/v3' #authorization URL
   password = objectstorage_creds['password'] #password
   project_id = objectstorage_creds['projectId'] #project id
   user_id = objectstorage_creds['userId'] #user id 
   region_name = objectstorage_creds['region'] #region name 

def predict_joblib():
  print('satart')
  conn = swiftclient.Connection(key=password,authurl=auth_url,auth_version='3',os_options={"project_id": project_id,"user_id": user_id,"region_name": region_name})
  container_name = 'new-container'

  # File name for testing
  file_name = 'requirment.txt'

  # Create a new container
  conn.put_container(container_name)
  print ("nContainer %s created successfully." % container_name)

  # List your containers
  print ("nContainer List:")
  for container in conn.get_account()[1]:
    print (container['name'])

  # Create a file for uploading
  with open(file_name, 'w') as example_file:
    conn.put_object(container_name,file_name,contents= "",content_type='text/plain')

  # List objects in a container, and prints out each object name, the file size, and last modified date
  print ("nObject List:")
  for container in conn.get_account()[1]:
    for data in conn.get_container(container['name'])[1]:
      print ('object: {0}t size: {1}t date: {2}'.format(data['name'], data['bytes'], data['last_modified']))

  # Download an object and save it to ./my_example.txt
  obj = conn.get_object(container_name, file_name)
  with open(file_name, 'w') as my_example:
    my_example.write(obj[1])
  print ("nObject %s downloaded successfully." % file_name)




@app.route('/')
def hello():
    dff = predict_joblib()
    return 'Welcome to Python Flask!'

@app.route('/signUp')
def signUp():
    return 'signUp'


port = os.getenv('PORT', '5000')
if __name__ == "__main__":
    app.debug = True
    app.run(host='0.0.0.0', port=int(port))

【问题讨论】:

    标签: python ibm-cloud pickle object-storage


    【解决方案1】:

    由于file.openpickle.dumps 都返回了python 文档中显示的字节对象:

    pickle.dumps(obj, protocol=None, *, fix_imports=True) 将对象的腌制表示作为字节对象返回,而不是将其写入文件。

    打开(名称[,模式[,缓冲]]) 打开一个文件,返回文件对象部分中描述的文件类型的对象。如果无法打开文件,则会引发 IOError。打开文件时,最好使用 open() 而不是直接调用文件构造函数。

    您可以只处理要存储为obj 的对象,例如:

    # Create a file for uploading
    file = pickle.dumps(obj)
    conn.put_object(container_name,file,contents= "",content_type='application/python-pickle')
    

    内容类型的这种变化是由于 http 协议中的标准造成的。这是我从另一个 SO 问题中得到的,请检查。如前所述:

    这是事实上的标准。 RFC2046 状态:4.5.3。其他应用程序子类型 预计将来会定义许多其他“应用程序”子类型。 MIME 实现必须至少将任何无法识别的子类型视为等同于“应用程序/八位字节流”。因此,对于非 pickle 感知系统,流看起来像任何其他八位字节流,但对于启用 pickle 的系统,这是至关重要的信息

    【讨论】:

    • 感谢您的建议,但在 swift 客户端中,我们没有保存文件的路径,我们只需将带有“put_object”的文件存储到容器中。
    • @JeanPaulDepraq 感谢您的回答,但我仍然在 pickle.dumps(obj) 上遇到“内存不足”问题,因为正如您所说的“转储”返回字节,并且在下一行我必须保存文件中的那个对象。那么这意味着它暂时使用我的磁盘空间?我的主要问题是,在 bluemix 中我只有 2 GB 的存储空间,但我创建的 pickle 文件是 5GB,所以我必须将我的文件保存在对象存储中。
    • @sagar43 我检查了dumps 实现,它不使用磁盘空间。您的 ram 内存用完了,因此我会将对象分成 500mbs 的块,然后发送它,然后在取回它时将其完整构建。我不知道你有多少垃圾内存,但你甚至可以将 1.5gbs 的 pickle 块写入磁盘,然后打开文件并像在你的示例中一样发送它。
    • 我有 8GB 内存,但如果我使用泡菜压缩是内存错误,我也会收到错误消息。但是当我在没有压缩的情况下使用时,我在 Dump() 上遇到错误,这是物理内存的错误。我不知道为什么会这样,我一无所知。
    • @JeanPaulDepraq 你愿意使用 PySpark 和 Jupyter 笔记本吗?如果是这样,您可以使用saveAsPickleFile 写出pickle,这将执行并行写入并避免RAM 内存耗尽。写入路径将使用“swift://”协议 url。如果这是一个选项,愿意按照这些思路写一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多