django Python中优化大型数据集性能的有效方法?

7vux5j2d  于 2023-05-30  发布在  Go
关注(0)|答案(2)|浏览(125)

我目前正在做一个项目,涉及在Python中处理大型数据集。虽然我已经设法使它工作,但我面临着性能和效率的挑战,特别是在处理大量数据时。
为了提供更多的上下文,让我们假设我有一个包含数百万条记录的数据集,我需要对它执行复杂的计算或数据转换。目前,我的代码需要大量的时间来处理数据,并且似乎消耗了大量的内存,导致潜在的内存错误或速度减慢。
下面是我的代码结构的一个简化示例:

import pandas as pd

def process_large_dataset():
    # Load the large dataset into a DataFrame
    df = pd.read_csv('large_dataset.csv')

    # Perform computationally intensive operations
    # ... (complex computations or data transformations)

    # Store the processed data to a new file or database
    df.to_csv('processed_data.csv', index=False)

我想优化我的代码,提高它在处理大型数据集时的效率。具体而言,我正在就以下方面寻求意见:
内存管理:在处理大型数据集时,减少内存使用的最佳做法是什么?在数据加载、处理或存储过程中,是否有任何技术可以最小化内存占用?
加快处理速度:如何加速数据处理任务以提高整体性能?是否有任何优化的函数或算法可以更有效地处理大型数据集?
避免瓶颈:在Python中处理大型数据集时,常见的瓶颈或性能限制是什么?我的代码中是否有任何特定的区域可能成为潜在的瓶颈,我如何解决它们?
我愿意利用流行的库,如pandas,NumPy,Dask或任何其他相关工具。此外,我愿意探索替代代码结构、并行处理技术或任何其他可以显著提高Python处理大型数据集的性能和效率的策略。
我将非常感谢任何意见,建议,代码示例或相关资源的引用,这些资源可以帮助我克服这些挑战并优化我的代码,以实现高效的大规模数据处理。
非常感谢您的宝贵帮助!

sdnqo3pr

sdnqo3pr1#

因此,当我选择Python作为我的工具时,我倾向于忽略内存管理和优化当前CPU等优化。我们当然需要look at the O of the code we're writing.但是,如果我们想深入研究,我们可能应该选择一种不同的语言。
话虽如此,我倾向于选择Python,因为当我处理大型数据集时,我是在一个网络上进行的,这个网络与为数据问题类型设计的更好的解决方案相关联。通常,Python只是绑定到不同的大数据技术。
因此,我不查看示例的RAM,而是查看数据在Redis这样的数据存储中的位置。
然后我们会问这样的问题,我们可以使用多个线程或多台机器吗?如果答案是肯定的,通常情况下,我们可以将较大的数据集分成部分并并行处理这些部分。老实说,它听起来比Python复杂得多,因为有许多基于社区任务队列的解决方案such as Celery
因此,如果我们将数据集拆分并为其排队任务,则可以将可扩展数量的工作进程放在数据集后面,以便在一组公共内存(可能是数据存储或even a NoSQL database such as MongoDB.)上进行并行处理
如果我们发现自己处于无法分割数据的情况下,并且必须在一个线程中完成这些事情,那么我们可能首先就不应该用Python编写这些东西。我喜欢Python。我用它做了很多工作。但在这种情况下,我们绝对应该使用像C这样的编译语言来实际获得赛车的性能。Python并不是一门高性能语言。基于Python的大型系统实际上通过进行网络调用or being bound to C来获得这种性能。

yrdbyhpb

yrdbyhpb2#

在我看来,要选择一个好的方法来解决你的问题,你应该问自己以下几个问题:“我需要内存中的所有数据来执行计算吗?“

**如果答案是否定的,**您可以坚持使用pandas并利用chunking分块执行计算。下面,我粘贴了一个简单的例子,说明如何使用pandas执行chunking,并向数据集添加一列,同时一次只将1/10的数据加载到内存中。在scaling上还有一个pandas用户指南。您还可以查看polars,它专门设计用于处理比可用RAM大得多的数据集。
**如果答案是肯定的,**您应该考虑在spark cluster之类的框架上执行计算,这是一个专门为大规模并行数据处理而设计的框架。另一位SO用户也寻求帮助,寻求一种处理数百万观察结果的好方法,在他的案例中,我推荐了PySpark-您可以找到答案here

如何在pandas中执行chunking的示例:

import pandas as pd
import numpy as np

# create dummy data with 1 million rows
data = {
    'col_1': [1, 2, 3, 4] * 250_000,
    'col_2': ['a', 'b', 'c', 'd'] * 250_000 
}
df = pd.DataFrame(data)
print(df.shape)  # (1000000, 2)

# save to disk
df.to_csv('my_csv.csv', index=False)
del df

# load 100'000 rows at a time, process them, and save them
for i, df in enumerate(pd.read_csv('my_csv.csv', chunksize=100_000)):
    
    # perform your calculations for individual parts of your dataframe
    df['col_3'] = df['col_1'] + 1

    if i == 0:
        df.to_csv('my_new_csv.csv', index=False)
    else:
        df.to_csv('my_new_csv.csv', index=False, mode='a', header=False)
del df    

# load entire dataframe to get shape
df = pd.read_csv('my_new_csv.csv')
print(df.shape)  # (1000000, 3)

相关问题