相关疑难解决方法(0)

Python:预加载内存

我有一个 python 程序,我需要在其中加载和反序列化 1GB 的 pickle 文件。这需要 20 秒,我想要一种机制,可以随时使用泡菜的内容。我看过shared_memory但它的所有使用示例似乎都涉及 numpy 而我的项目不使用 numpy。使用shared_memory或以其他方式实现这一目标的最简单和最干净的方法是什么?

这就是我现在加载数据的方式(每次运行):

def load_pickle(pickle_name):
    return pickle.load(open(DATA_ROOT + pickle_name, 'rb'))
Run Code Online (Sandbox Code Playgroud)

我希望能够在两次运行之间编辑模拟代码而无需重新加载泡菜。我一直在搞乱,importlib.reload但对于包含许多文件的大型 Python 程序来说,它似乎真的不太好用:

def main():
    data_manager.load_data()
    run_simulation()
    while True:
        try:
            importlib.reload(simulation)
            run_simulation()
        except:
        print(traceback.format_exc())
        print('Press enter to re-run main.py, CTRL-C to exit')
        sys.stdin.readline()
Run Code Online (Sandbox Code Playgroud)

python shared-memory

26
推荐指数
2
解决办法
707
查看次数

如何使用Spark(pyspark)编写镶木地板文件?

我是Spark的新手,我一直在尝试将一个Dataframe转换为Spark中的镶木地板文件,但我还没有成功.该文件说,我可以使用write.parquet函数来创建该文件.但是,当我运行脚本时它向我显示:AttributeError:'RDD'对象没有属性'write'

from pyspark import SparkContext
sc = SparkContext("local", "Protob Conversion to Parquet ")

# spark is an existing SparkSession
df = sc.textFile("/temp/proto_temp.csv")

# Displays the content of the DataFrame to stdout
df.write.parquet("/output/proto.parquet")
Run Code Online (Sandbox Code Playgroud)

你知道怎么做这个吗?

我正在使用的spark版本是为Hadoop 2.7.3构建的Spark 2.0.1.

python pyspark spark-dataframe

13
推荐指数
2
解决办法
5万
查看次数

以内存高效的方式从 python 中的流创建 Parquet 文件

在 Python 中创建 Parquet 文件的最常见方法似乎是首先创建 Pandas 数据框,然后使用 pyarrow 将表写入 Parquet。我担心这可能会导致内存使用量过大 - 因为它需要至少将数据集的一份完整副本存储在内存中才能创建 pandas 数据帧。

我想知道是否由于列压缩要求而需要将整个数据集加载到内存中,或者是否有更高效且基于流的方法。就我而言,我将以流媒体方式接收记录。对于类似的 csv 输出过程,我们以 1000 为批量将行写入磁盘,因此需要在内存中保存的行数永远不会达到完整数据集的大小。

我是不是该...?:

  1. 只需创建一个 pandas 数据框,然后将其写入镶木地板。(这意味着整个数据集需要存储在内存中,但我们将此视为必要要求。)
  2. 使用一些流友好的方式在我们收到它们时一次写入 1000 行左右,从而最大限度地减少整个过程中总的时间点 ram 消耗。(我没有看到任何有关如何执行此操作的文档,而且我不确定它是否是镶木地板的选项。)
  3. 将所有内容写入 CSV,然后使用智能读取/分析 CSV 内容并在事后创建压缩镶木地板的函数。(运行时间可能较慢,但内存配置文件较低,并且在非常大的文件上失败的机会较低。)

想法?建议?

python parquet fastparquet pyarrow

10
推荐指数
1
解决办法
5740
查看次数

读取/写入 Parquet 文件而不读入内存(使用 Python)


我查看了我期望能够满足我的需求的标准文档(Apache ArrowPandas),但我似乎无法弄清楚。

我最了解Python,所以我想使用Python,但这不是严格要求。

问题

我需要将 Parquet 文件从一个位置(URL)移动到另一个位置(Azure 存储帐户,在本例中使用 Azure 机器学习平台,但这与我的问题无关)。

这些文件太大而无法简单地执行pd.read_parquet("https://my-file-location.parquet"),因为这会将整个文件读取到一个对象中。

期待

我认为必须有一种简单的方法来创建文件对象并逐行流式传输该对象 - 或者可能逐列块。就像是

import pyarrow.parquet as pq

with pq.open("https://my-file-location.parquet") as read_file_handle:
    with pq.open("https://my-azure-storage-account/my-file.parquet", "write") as write_filehandle:
        for next_line in read_file_handle{
            write_file_handle.append(next_line)
Run Code Online (Sandbox Code Playgroud)

我知道它会有点不同,因为 Parquet 主要是为了以柱状方式访问。也许我会传递某种配置对象,它指定感兴趣的列,或者可以在一个块或类似的东西中抓取多少行。

但主要的期望是有一种方法可以访问 parquet 文件,而无需将其全部加载到内存中。我怎样才能做到这一点?

FWIW,我确实尝试过只使用 Python 的标准open函数,但我不确定如何使用openURL 位置和字节流。如果可以通过跳过open任何 Parquet 特定的内容来完成此操作,那也很好。

更新

一些评论建议使用类似 bash 的脚本,例如这里。如果没有别的办法我可以使用这个,但它并不理想,因为:

  • 我宁愿将这一切保留在完整的语言 SDK 中,无论是 Python、Go 还是其他语言。如果解决方案转移到带有管道的 bash 脚本中,则需要外部调用,因为最终解决方案不会完全由 bash、Powershell 或任何脚本语言编写。
  • 我真的很想利用 Parquet 本身的一些优势。正如我在下面的评论中提到的,Parquet 是列式存储。因此,如果我有一个包含 …

python io parquet

7
推荐指数
2
解决办法
1万
查看次数

将非常大的 csv 转换为 parquet

我正在尝试将 csv 文件转换为镶木地板(我真的不在乎它是在 python 还是命令行中完成的,或者...)无论如何,这个问题解决的是,但答案似乎需要一个人来阅读首先是 csv,因为在我的例子中 csv 是 17GB,所以这实际上并不可行,所以我想要一些“离线”或流式传输方法。

python csv parquet

5
推荐指数
1
解决办法
472
查看次数