<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[pysense的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/pysense</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; pysense]]></copyright><item><title><![CDATA[Java并发进阶系列：深度讨论高并发跳表数据结构ConcurrentSkipListMap的源代码实现（上）]]></title><link>https://blog.csdn.net/pysense/article/details/120309122</link><guid>https://blog.csdn.net/pysense/article/details/120309122</guid><author>pysense</author><pubDate>Fri, 13 Jun 2025 21:53:45 +0800</pubDate><description><![CDATA[文章摘要： 本文分析了Java中ConcurrentSkipListMap（CSM）在高并发有序键值对场景下的应用优势。相比HashMap和TreeMap，CSM通过跳表结构实现并发有序存储，适用于物联网时序数据等场景。文章详细解析了CSM的四层跳表结构，包括数据节点层（Node）和三层索引层（Index/HeadIndex），重点说明其right、down指针和node指针的设计原理。通过代码示例展示了CSM保持key有序的特性，并与ConcurrentHashMap的无序输出形成对比。全文分为上下两篇，]]></description><category></category></item><item><title><![CDATA[Java并发进阶系列：深度讨论官方关于jdk1.8ConcurrentHashMap的computeIfAbsent源代码修复逻辑]]></title><link>https://blog.csdn.net/pysense/article/details/119734952</link><guid>https://blog.csdn.net/pysense/article/details/119734952</guid><author>pysense</author><pubDate>Tue, 20 May 2025 17:45:06 +0800</pubDate><description><![CDATA[在文章中《深度解析官方关于jdk1.8的resizeStamp的bug处理过程》，我们讨论关于CHM的核心设计——resizeStam需要修复的处理过程，本文再次基于openJDK的bugs讨论组提出的CHM源代码另外一个会造成死循环的bug，默认读者已经掌握CHM的核心源代码实现，否则无法从本文的讨论中获益。文章前部分先把computeIfAbsent的bug成因分析清楚，再来介绍官网ConcurrentHashMap.computeIfAbsent stuck in an endless loop的讨论]]></description><category></category></item><item><title><![CDATA[Java并发进阶系列：jdk1.8 ConcurrentHashMap的TreeBin读写锁竞争机制讨论]]></title><link>https://blog.csdn.net/pysense/article/details/119183553</link><guid>https://blog.csdn.net/pysense/article/details/119183553</guid><author>pysense</author><pubDate>Tue, 20 May 2025 17:44:47 +0800</pubDate><description><![CDATA[本文深入分析了ConcurrentHashMap中TreeBin类的设计原理，重点探讨了其读写锁竞争机制。文章指出TreeBin作为红黑树的包装节点，通过保持加锁对象不变性解决了并发环境下的线程安全问题。相比HashMap直接使用TreeNode作为头节点可能导致锁失效的问题，TreeBin的设计既保证了写操作的独占性，又避免了频繁的根节点移动操作。此外，TreeBin内部实现了特殊的读写锁控制机制，在tree restructuring操作（如插入、删除节点）时能正确处理读写线程的竞争关系。这种设计使Co]]></description><category></category></item><item><title><![CDATA[Java并发进阶系列：深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程]]></title><link>https://blog.csdn.net/pysense/article/details/119150896</link><guid>https://blog.csdn.net/pysense/article/details/119150896</guid><author>pysense</author><pubDate>Tue, 20 May 2025 17:44:14 +0800</pubDate><description><![CDATA[本文通过埋点打印法研究JDK1.8中ConcurrentHashMap的多线程扩容机制。测试代码创建64个线程并发put数据，初始容量为8（实际调整为16）。通过修改MIN_TRANSFER_STRIDE为4并添加调试打印，观察线程分配桶位区间的情况。结果显示：前16个线程分别占据16个桶位，当第11号线程put后触发扩容（达到阈值12），成为第一个进入transfer方法的线程。随后其他线程也陆续进入扩容逻辑，各自分配不同的桶位区间（如[12,15]、[4,7]等）进行数据迁移。该方法通过关键位置埋点，直]]></description><category></category></item><item><title><![CDATA[Java并发进阶系列：jdk1.8的HashMap红黑树设计原理及其源代码深入解析（不含balanceDetection方法）]]></title><link>https://blog.csdn.net/pysense/article/details/117082783</link><guid>https://blog.csdn.net/pysense/article/details/117082783</guid><author>pysense</author><pubDate>Tue, 20 May 2025 17:43:23 +0800</pubDate><description><![CDATA[本文深入解析了JDK1.8中HashMap红黑树部分的实现原理，主要包含以下内容： 背景知识：介绍了红黑树的命名由来及其与二叉搜索树的关系。 红黑树的5个核心性质：包括节点颜色规则、根节点和叶子节点要求、红节点限制以及黑色平衡特性。 变色及旋转操作的必要性：解释了通过变色、左旋和右旋操作来维护红黑树平衡的原理。 详细图解了左旋操作的完整过程，展示了节点关系调整的具体实现方式。 文章通过大量图示和实例，帮助读者深入理解红黑树在HashMap中的实现机制及其平衡维护策略，适合已具备基础数据结构知识的开发者阅读。]]></description><category></category></item><item><title><![CDATA[spark的缓存提升本质以及分区数量和task执行时间的先后]]></title><link>https://blog.csdn.net/pysense/article/details/130762143</link><guid>https://blog.csdn.net/pysense/article/details/130762143</guid><author>pysense</author><pubDate>Tue, 20 May 2025 17:40:49 +0800</pubDate><description><![CDATA[本文通过Spark缓存机制的性能分析实验，展示了RDD持久化对计算效率的提升效果。实验使用145MB的搜狗日志数据，对比了缓存前后的执行差异：首次执行count操作耗时14秒（5个分区），数据被缓存后再次执行仅需7秒（10个分区）。分析发现：（1）缓存避免了重复的Map阶段计算；（2）CPU核数（4核）决定task并行度，任务按核数分批执行；（3）增加分区数量能提升效率（10分区比5分区快1倍）。通过Web UI的Stage和Task监控界面，直观验证了"缓存复用"和"分区并行"对Spark性能优化的关键作]]></description><category></category></item><item><title><![CDATA[Java并发进阶系列：深度讨论官方关于jdk1.8ConcurrentHashMap的resizeStamp源代码修复逻辑]]></title><link>https://blog.csdn.net/pysense/article/details/119150955</link><guid>https://blog.csdn.net/pysense/article/details/119150955</guid><author>pysense</author><pubDate>Tue, 20 May 2025 11:18:05 +0800</pubDate><description><![CDATA[本文分析了Java 8中ConcurrentHashMap的resizeStamp方法存在的bug。该bug会导致在多线程扩容场景下，某些线程无法正确参与扩容任务，从而影响性能。虽然这个bug不会引发数据错误，但会影响并发扩容效率。官方已在Java 12中修复此问题，修复方式是将条件判断修改为(sc >>> RESIZE_STAMP_SHIFT) == rs + 1。文章详细记录了该bug的发现过程、官方讨论及修复建议，并提供了相关版本说明和代码片段分析。]]></description><category></category></item><item><title><![CDATA[基于AQS驱动的ReentrantLock公平锁和非公平锁实现原理解析]]></title><link>https://blog.csdn.net/pysense/article/details/124681671</link><guid>https://blog.csdn.net/pysense/article/details/124681671</guid><author>pysense</author><pubDate>Tue, 20 May 2025 11:17:17 +0800</pubDate><description><![CDATA[本文通过代码调试分析了ReentrantLock的可重入特性及其底层AQS实现机制。重点解析了： 通过state变量记录锁重入次数，加锁时CAS递增，解锁时递减； 以NonfairSync为例展示了非公平锁的直接抢锁逻辑； 揭示了AQS通过volatile state变量和CAS操作实现同步状态管理； 完整跟踪了lock()/unlock()方法的执行流程，说明AQS是JUC锁工具的底层基础。]]></description><category></category></item><item><title><![CDATA[Java并发进阶系列：深度讨论高并发跳表数据结构ConcurrentSkipListMap的源代码实现（下）]]></title><link>https://blog.csdn.net/pysense/article/details/120343349</link><guid>https://blog.csdn.net/pysense/article/details/120343349</guid><author>pysense</author><pubDate>Tue, 20 May 2025 11:16:53 +0800</pubDate><description><![CDATA[文章摘要：本文深入解析高并发跳表结构ConcurrentSkipListMap的删除操作实现原理。上篇介绍了数据结构设计及doGet、doPut方法，下篇重点分析doRemove核心方法。删除操作采用"惰性删除"策略，通过标记节点value为null实现两阶段删除：先标记后物理移除。源码中通过helpDelete方法和marker节点确保并发安全，详细阐述了(b,n,f)三指针模型的处理逻辑，包括节点查找、标记删除和物理删除等关键步骤，展现了Doug Lea在并发控制上的精妙设计。]]></description><category></category></item><item><title><![CDATA[Java进阶系列：深度解析jdk1.8的HashMap红黑树balanceDeletion节点删除平衡算法设计（核心文章）]]></title><link>https://blog.csdn.net/pysense/article/details/119580495</link><guid>https://blog.csdn.net/pysense/article/details/119580495</guid><author>pysense</author><pubDate>Tue, 20 May 2025 11:15:42 +0800</pubDate><description><![CDATA[这篇文章深入解析了JDK1.8中HashMap红黑树的balanceDeletion方法实现，重点剖析了红黑树删除节点时的平衡调整逻辑。文章指出该方法是HashMap源码中最复杂难懂的部分，现有技术文章大多回避直接分析或采用简化实现。作者比较了现有解析的不足，推荐了一篇相对深入的CSDN博客，但认为其图示和解释仍有优化空间。 全文从removeNode方法入手，逐步拆解红黑树删除流程： 首先分析removeNode的整体逻辑，包括链表和红黑树节点的查找定位 重点讲解removeTreeNode的双重删除机制]]></description><category></category></item><item><title><![CDATA[Java高级主题：深入解析ThreadLocal的数据结构设计原理及其源代码实现]]></title><link>https://blog.csdn.net/pysense/article/details/124776339</link><guid>https://blog.csdn.net/pysense/article/details/124776339</guid><author>pysense</author><pubDate>Tue, 20 May 2025 11:06:35 +0800</pubDate><description><![CDATA[ThreadLocal通过无锁设计实现线程隔离，每个线程拥有独立的ThreadLocalMap存储变量副本。其核心数据结构采用数组和线性探测法解决哈希冲突，通过弱引用Entry避免内存泄漏。使用时需注意及时调用remove()清理无效Entry，防止因弱键回收导致的潜在内存问题。ThreadLocalMap的设计兼顾并发性能与内存效率，但需理解其底层机制才能正确使用。]]></description><category></category></item><item><title><![CDATA[基于AQS实现的ReentrantReadWriteLock源代码深入分析]]></title><link>https://blog.csdn.net/pysense/article/details/124824744</link><guid>https://blog.csdn.net/pysense/article/details/124824744</guid><author>pysense</author><pubDate>Tue, 20 May 2025 11:05:25 +0800</pubDate><description><![CDATA[摘要：ReentrantReadWriteLock通过读写分离提升并发性能，适用于读多写少场景。它使用int类型的state变量高16位记录读锁数量（共享模式），低16位记录写锁重入次数（独占模式）。读锁允许多线程并发访问，写锁则互斥独占，支持锁降级（写锁转读锁）但不支持锁升级（读锁转写锁）。源码示例展示了如何通过锁降级确保数据一致性。这种设计通过位运算高效管理读写状态，显著提升了高并发环境下的性能表现。]]></description><category></category></item><item><title><![CDATA[pandas使用to_sql快速写入mysql]]></title><link>https://blog.csdn.net/pysense/article/details/131544619</link><guid>https://blog.csdn.net/pysense/article/details/131544619</guid><author>pysense</author><pubDate>Wed, 12 Feb 2025 15:26:14 +0800</pubDate><description><![CDATA[本文介绍了使用pandas的to_sql()方法写入数据库时如何指定字段数据类型。通过dtype参数可设置各列的SQL类型（如DATE、CHAR、VARCHAR等），需从sqlalchemy.types导入相应类型并构建列名与类型的字典。示例展示了三种写入场景：替换表并包含索引、追加数据、替换表并指定字段类型为CHAR(4)。文章还建议大数据量写入时设置合理的chunksize值（5000-10000），若遇连接超时可适当调小。文末提供了sqlalchemy支持的数据类型列表供参考。]]></description><category></category></item><item><title><![CDATA[pandas常见的棘手编程汇总]]></title><link>https://blog.csdn.net/pysense/article/details/132779388</link><guid>https://blog.csdn.net/pysense/article/details/132779388</guid><author>pysense</author><pubDate>Sat, 09 Sep 2023 16:42:49 +0800</pubDate><description><![CDATA[如果是字符串中仅有一个%，那么python会把它解析为字符串占位，因此解决办法是：加多一个%此时bad_cols存放三列数据，表名，原字段，剔除其他字符的中文字段。考虑到当表1和表2含有相同的字段名称时，通过df合并后，就会出现以下。解决unsupported format character。当要处理的表有是中文加各种符号时，提示。例如有些字段在创建时采用无意义字符，保留字段里面的中文，去到其他字符。关于模糊查询的sql中出现异常。或者：(此写法作为推荐写法)返回表名中含有关键字的表。]]></description><category></category></item><item><title><![CDATA[分析Kafka offset管理与Spark Streaming背压速率（待更）]]></title><link>https://blog.csdn.net/pysense/article/details/104696767</link><guid>https://blog.csdn.net/pysense/article/details/104696767</guid><author>pysense</author><pubDate>Thu, 19 Mar 2020 22:21:45 +0800</pubDate><description><![CDATA[1、背压问题涉及到自动调整ss消费消息的速率，以便让计算处理能力跟接收消息的能力匹配
2、手动管理offset的文章
为何要管理offset
三种场合都需要保证重启ss进程后，能够接着上次消费的位置进行消费

...]]></description><category></category></item><item><title><![CDATA[基于PySpark整合Spark Streaming与Kafka]]></title><link>https://blog.csdn.net/pysense/article/details/104179736</link><guid>https://blog.csdn.net/pysense/article/details/104179736</guid><author>pysense</author><pubDate>Fri, 06 Mar 2020 23:43:11 +0800</pubDate><description><![CDATA[本文介绍了基于PySpark整合Spark Streaming和Kafka实现实时消息处理的方案。首先搭建了单机Kafka环境（版本2.11-2.4.0），配置了Zookeeper和Kafka服务，并测试了消息生产消费功能。然后详细说明了Spark Streaming连接Kafka所需的两个关键JAR包，给出了PySpark程序示例，演示了如何通过KafkaUtils.createDirectStream接口实时消费Kafka消息并进行单词计数。程序采用Direct API模式，每5秒统计一次单词频率并输出]]></description><category></category></item><item><title><![CDATA[深入理解异步IO的底层逻辑——IO多路复用（select、poll、epoll）]]></title><link>https://blog.csdn.net/pysense/article/details/103840680</link><guid>https://blog.csdn.net/pysense/article/details/103840680</guid><author>pysense</author><pubDate>Tue, 21 Jan 2020 23:12:17 +0800</pubDate><description><![CDATA[文章目录前言1、理解文件描述符1.1 基本概念1.2 打开一个文件1.3 对文件描述符进行读写1.4 通过管道打开文件描述符1.5 常见的文件描述符0、1、21.6 进程打开文件描述符的个数1.7 文件描述符底层原理本节小结2、 IO多路复用原理2.1 IO触发用户空间与内核空间之间的切换2.1 IO模型的介绍
前言
  在前面两篇文章《gevent与协程》和《asyncio与协程》，讨论了有关协...]]></description><category></category></item><item><title><![CDATA[Spark DataFrame、Spark SQL、Spark Streaming入门教程]]></title><link>https://blog.csdn.net/pysense/article/details/103978811</link><guid>https://blog.csdn.net/pysense/article/details/103978811</guid><author>pysense</author><pubDate>Tue, 14 Jan 2020 21:50:59 +0800</pubDate><description><![CDATA[文章目录前言1、RDD、Spark DataFrame、Spark SQL、Spark Streaming2、Spark DataFrame2.1 创建基本的Spark DataFrame2.2  从各类数据源创建Spark DataFrame2.3 Spark DataFrame持久化数据2.4 Dataframe常见的API3、Spark SQL4、Spark Streaming实时计算TCP...]]></description><category></category></item><item><title><![CDATA[基于PySpark和ALS算法实现基本的电影推荐流程]]></title><link>https://blog.csdn.net/pysense/article/details/103880967</link><guid>https://blog.csdn.net/pysense/article/details/103880967</guid><author>pysense</author><pubDate>Sat, 11 Jan 2020 10:23:19 +0800</pubDate><description><![CDATA[本文介绍了PySpark的基本原理和常用算子。第一部分通过Py4J库实现Python与Java交互，解释了PySpark的工作原理。第二部分详细列举了PySpark的核心算子，包括数据读取、转换（map、filter、flatMap等）和行动操作（collect等），并附有代码示例。此外，还介绍了键值对RDD的处理方法（如mapValues、subtractByKey等）。这些内容为大数据实时分析项目提供了基础入门知识。]]></description><category></category></item><item><title><![CDATA[深入解析asyncio与协程]]></title><link>https://blog.csdn.net/pysense/article/details/103745410</link><guid>https://blog.csdn.net/pysense/article/details/103745410</guid><author>pysense</author><pubDate>Sat, 04 Jan 2020 21:10:48 +0800</pubDate><description><![CDATA[文章目录前言1、asyncio的基本概念2、使用asyncio2.1 使用async关键字和await定义协程2.2 task对象2.2 future对象2.3 获取协程并发执行后的所有返回值2.4 asyncio.gather vs asyncio.wait2.5 嵌套协程的实现2.6 如何取消运行中协程2.7  理解loop的相关方法2.7.1 loop.run_until_complate ...]]></description><category></category></item></channel></rss>